Java 8 如何在Java8'中从tryAdvance方法返回值;谁是分流器?

Java 8 如何在Java8'中从tryAdvance方法返回值;谁是分流器?,java-8,java-stream,Java 8,Java Stream,我是java8的新手,试图理解java8的splitIterator特性 我已经编写了以下代码,我的要求是无论何时调用get();get方法应该从itr3返回一个值;有可能得到同样的结果吗?怎么做 public class TestSplitIterator { static List<Integer> list = new ArrayList<Integer>(); public static void main(String args[]) { for

我是java8的新手,试图理解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)

  }

}
公共类TestSplitIterator{
静态列表=新的ArrayList();
公共静态void main(字符串参数[]){
对于(int i=0;i<100;i++){
列表.添加(i);
}
//每当我调用下面的方法调用时,它应该只返回一个值;
获取(列表);
}
私有静态int-get(列表){
Collections.sort(list,Collections.reverseOrder());
系统输出打印项次(列表);
Spliterator itr1=list.Spliterator();
拆分器itr2=itr1.trySplit();
拆分器itr3=itr2.trySplit();
//每当get(调用列表ic)时,我想从itr3返回值
}
}

如果我没有误解你的话。您需要一个收集器对象来收集拆分器中的元素。例如:

Integer[] collector = new Integer[1];

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

System.out.println(collector[0]);
List<Integer> collector = new ArrayList<>();

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

System.out.println(collector);
使用另一个
列表
收集拆分器中的所有元素,例如:

Integer[] collector = new Integer[1];

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

System.out.println(collector[0]);
List<Integer> collector = new ArrayList<>();

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

System.out.println(collector);
List collector=new ArrayList();
而(itr3.tryAdvance(collector::add));
系统输出打印项次(收集器);

而不是
while(itr3.tryAdvance(collector::add))
您可以使用itr3.forEachRemaining(收集器::add)
将执行完全相同的(
默认值
实现)或以可能更有效的方式(如果被特定的
拆分器
覆盖)执行语义相同的操作。我已经看到,对于从拆分器收集一个元素的任务,有些人使用一个实现消费者的类:
类HoldingConsumer实现消费者{private T T;public void accept(T){this.T=T;}public T get(){return T;}
@Holger,如果要遍历列表,使用foreachrestain会很有用,我的要求是每次调用get方法时获取单个值。使用(collector::add)可以实现同样的效果吗?@Rogger296:我指的是这个答案的第二个示例,它在循环中调用
tryAdvance
,直到返回
false
。该循环相当于
forEachRemaining
,它将复制所有剩余的元素。当然,您可以不使用循环调用
tryAdvance
方法,即
itr3.tryAdvance(collector::add)
仅向列表中添加一个元素。@FedericoPeraltaSchaffner感谢您共享代码。你能说说你的代码的好处吗?