JAVAJava8中的util接口拆分器

先决条件: java中的迭代器

null

与其他迭代器一样,拆分器用于遍历源的元素。源可以是源 收集 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种方法:

  1. 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.
    
  2. 长估计大小() :它返回要迭代的元素数的估计值,或返回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.
    
  3. 默认长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.
    
  4. 默认比较器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.
    
  5. 默认布尔特征(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.
    
  6. 布尔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
    
  7. 默认无效(消费者操作) :在当前线程中按顺序对每个剩余元素执行给定操作,直到所有元素都已处理或该操作引发异常。如果命令此拆分器,操作将按遇到顺序执行。操作引发的异常将转发给调用方。
    Syntax : 
    default void forEachRemaining(Consumer<? super T>action)
    Parameters : 
    action - The action
    Returns :
    NA
    Throws :
    NullPointerException - if the specified action is null
    
  8. 拆分器 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主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享