如何从Java8的spliterator中的tryAdvance方法返回值?

Rog*_*296 2 java-8 java-stream

我是Java 8的新手,试图了解Java8的splitIterator功能。

我已经编写了以下代码,我的要求是每当我调用get()时;get方法应该从itr3返回一个值;是否有可能得到相同的?如何?

public class TestSplitIterator {

static List<Integer> list = new ArrayList<Integer>();

public static void main(String args[]) {

    for (int i = 0; i < 100; i++) {
        list.add(i);
    }
    // below method call should return only one value whenever i call it;
    get(list);
}

private static int get(List<Integer> list) {
    Collections.sort(list, Collections.reverseOrder());

    System.out.println(list);

    Spliterator<Integer> itr1 = list.spliterator();
    Spliterator<Integer> itr2 = itr1.trySplit();
    Spliterator<Integer> itr3 = itr2.trySplit();
    // i want to return value from itr3 whenever get(List list ic called)

  }

}
Run Code Online (Sandbox Code Playgroud)

hol*_*ava 5

如果我不误会你。您需要一个收集器对象,用于收集分隔符中的元素。例如:

Integer[] collector = new Integer[1];

boolean exist = itr3.tryAdvance(value -> collector[0] = value);

System.out.println(collector[0]);
Run Code Online (Sandbox Code Playgroud)

使用另一个收集分隔符中的所有元素List,例如:

List<Integer> collector = new ArrayList<>();

while (itr3.tryAdvance(collector::add)) ;

System.out.println(collector);
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`itr3.forEachRemaining(collector :: add);`来代替`while(itr3.tryAdvance(collector :: add));`来实现相同的功能(“ default”实现)或在语义上相同。可能更有效的方式(如果被特定的“分散器”所覆盖)。 (2认同)
  • 我已经看到,对于从分离器中收集一个元素的这项任务,有人使用了一个实现了Consumer的Holder类:class HoldingConsumer &lt;T&gt;实现了Consumer &lt;T&gt; public void accept(T t){this.t = t; } public T get(){return t; }}` (2认同)