先决条件: java中的迭代器
与其他迭代器一样,拆分器用于遍历源的元素。源可以是源 收集 一 IO通道 或者 生成函数 .
- 它包含在JDK 8中,除了支持顺序遍历之外,还支持高效的并行遍历(并行编程)。
- 然而,即使不使用并行执行,也可以使用Spliterator。您可能希望这样做的一个原因是,它结合了 哈斯奈特 和 下一个 将操作合并为一种方法。
对于集合,可以通过调用集合接口中的Spliterator()方法来创建Spliterator对象。
// Here "c" is any Collection object. splitr is of // type Spliterator interface and refers to "c" Spliterator splitr = c.spliterator();
Spliterator接口定义了8种方法:
- int特征() :返回此拆分器及其元素的一组特征。结果来自有序(0x00000010)、独立(0x00000001)、排序(0x00000004)、大小(0x00000040)、非空(0x00000100)、不可变(0x00000400)、并发(0x000001000)、子化(0x000004000)。
Syntax : int characteristics() Parameters : NA Returns : Returns the characteristics of the invoking spliterator, encoded into an integer.
- 长估计大小() :它返回要迭代的元素数的估计值,或返回Long。如果无限、未知或计算成本太高,则为最大值。
Syntax : long estimateSize( ) Parameters : NA Returns : Estimates the number of elements left to iterate and returns the result. Returns Long.MAX_VALUE if the count cannot be obtained for any reason.
- 默认长getExactSizeIfKnown() :便利方法,如果此拆分器已调整大小,则返回estimateSize(),否则返回-1。
Syntax : default long getExactSizeIfKnown( ) Parameters : NA Returns : If the invoking spliterator is SIZED, returns the number of elements left to iterate. Returns –1 otherwise.
- 默认比较器getComparator() :如果此拆分器的源按比较器排序,则返回该比较器。如果源按自然顺序排序,则返回null。否则,如果源未排序,则抛出IllegalStateException。
Syntax : default Comparator<? super T> getComparator( ) Parameters : NA Returns : Returns the comparator used by the invoking spliterator or null if natural ordering is used. Throws: IllegalStateException - If the sequence is unordered, IllegalStateException is thrown.
- 默认布尔特征(int-val) :如果此拆分器的特征()包含所有给定的特征,则返回true。
Syntax : default boolean hasCharacteristics(int val) Parameters : characteristics - the characteristics to check for Returns : Returns true if the invoking spliterator has the characteristics passed in val. Returns false otherwise.
- 布尔tryAdvance(消费者动作) :如果存在剩余元素,则对其执行给定操作,并返回true;否则返回false。如果此拆分器已被排序,则将按遇到顺序对下一个元素执行操作。操作引发的异常将转发给调用方。
Syntax : boolean tryAdvance(Consumer<? super T> action) Parameters : action - The action Returns : Returns true if there is a next element. Returns false if no elements remain. Throws : NullPointerException - if the specified action is null
- 默认无效(消费者操作) :在当前线程中按顺序对每个剩余元素执行给定操作,直到所有元素都已处理或该操作引发异常。如果命令此拆分器,操作将按遇到顺序执行。操作引发的异常将转发给调用方。
Syntax : default void forEachRemaining(Consumer<? super T>action) Parameters : action - The action Returns : NA Throws : NullPointerException - if the specified action is null
- 拆分器
trySplit() :如果可能,拆分调用的拆分器,返回对分区的新拆分器的引用。否则,返回null。因此,如果成功,原始拆分器将迭代序列的一部分,返回的拆分器将迭代序列的另一部分。Syntax : Spliterator<T> trySplit( ) Parameters : NA Returns : a Spliterator covering some portion of the elements, or null if this spliterator cannot be split
下面的示例演示拆分器的方法。
// Java program to demonstrate
// methods of Spliterator
import
java.util.ArrayList;
import
java.util.Spliterator;
import
java.util.stream.Stream;
public
class
SpliteratorDemo
{
public
static
void
main(String[] args)
{
// Create an array list for doubles.
ArrayList<Integer> al =
new
ArrayList<>();
// Add values to the array list.
al.add(
1
);
al.add(
2
);
al.add(-
3
);
al.add(-
4
);
al.add(
5
);
// Obtain a Stream to the array list.
Stream<Integer> str = al.stream();
// getting Spliterator object on al
Spliterator<Integer> splitr1 = str.spliterator();
// estimateSize method
System.out.println(
"estimate size : "
+ splitr1.estimateSize());
// getExactSizeIfKnown method
System.out.println(
"exact size : "
+ splitr1.getExactSizeIfKnown());
// hasCharacteristics and characteristics method
System.out.println(splitr1.hasCharacteristics(splitr1.characteristics()));
System.out.println(
"Content of arraylist :"
);
// forEachRemaining method
splitr1.forEachRemaining((n) -> System.out.println(n));
// Obtaining another Stream to the array list.
Stream<Integer> str1 = al.stream();
splitr1 = str1.spliterator();
// trySplit() method
Spliterator<Integer> splitr2 = splitr1.trySplit();
// If splitr1 could be split, use splitr2 first.
if
(splitr2 !=
null
) {
System.out.println(
"Output from splitr2: "
);
splitr2.forEachRemaining((n) -> System.out.println(n));
}
// Now, use the splitr
System.out.println(
"Output from splitr1: "
);
splitr1.forEachRemaining((n) -> System.out.println(n));
}
}
输出:
estimate size : 5 exact size : 5 true Content of arraylist : 1 2 -3 -4 5 Output from splitr2: 1 2 Output from splitr1: -3 -4 5
tryadvance方法的Java程序
看看 tryAdvance() 方法它执行一个 行动 然后前进迭代器。如图所示:
boolean tryAdvance(Consumer<? super T> action)
在这里 行动 指定对迭代中的下一个元素执行的操作,并且使用者是 功能接口 将动作应用于对象的。它是在中声明的通用功能接口 JAVAutil。作用 .它只有一种抽象方法, 接受() ,也就是 如图所示:
void accept(T objRef)
这里T是对象引用的类型。
为了实施我们的 行动 ,我们必须实施接受方法。为了实现accept方法,我们在这里使用 lambda表达式 .从下面的例子中可以更清楚地看到这一点。
如何在集合中使用拆分器 :对基本迭代任务使用拆分器非常简单,只需调用 tryAdvance() 直到它返回false。
// Java program to demonstrate simple Spliterator // using tryAdvance method import java.util.ArrayList; import java.util.Spliterator; public class SpliteratorDemo { public static void main(String[] args) { // Create an array list for doubles. ArrayList<Integer> al1 = new ArrayList<>(); // Add values to the array list. al1.add( 1 ); al1.add( 2 ); al1.add(- 3 ); al1.add(- 4 ); al1.add( 5 ); // Use tryAdvance() to display(action) contents of arraylist. System.out.print( "Contents of arraylist:" ); // getting Spliterator object on al1 Spliterator<Integer> splitr = al1.spliterator(); // Use tryAdvance() to display(action) contents of arraylist. // Notice how lambda expression is used to implement accept method // of Consumer interface while (splitr.tryAdvance((n) -> System.out.println(n))); // Use tryAdvance() for getting absolute values(action) of contents of arraylist. // Create new list that contains absolute values. ArrayList<Integer> al2 = new ArrayList<>(); splitr = al1.spliterator(); // Here our action is to get absolute values // Notice how lambda expression is used to implement accept method // of Consumer interface while (splitr.tryAdvance((n) -> al2.add(Math.abs(n)))); System.out.print( "Absolute values of contents of arraylist:" ); // getting Spliterator object on al2 splitr = al2.spliterator(); while (splitr.tryAdvance((n) -> System.out.println(n))); } } |
输出:
Contents of arraylist: 1 2 -3 -4 5 Absolute values of contents of arraylist: 1 2 3 4 5
注意tryAdvance()是如何整合hasNext()和next()的功能的 迭代器 在上面的示例中,转换为单个方法。这提高了迭代过程的效率。
在某些情况下,您可能希望对每个元素整体执行一些操作,而不是一次执行一个操作。为了处理这种情况,Spliterator提供了foreachrestaining()方法,它通常用于涉及 溪流 。此方法将操作应用于每个未处理的元素,然后返回。
本文由 高拉夫·米格拉尼 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。