Java 8 如何在Java8'中从tryAdvance方法返回值;谁是分流器?
我是java8的新手,试图理解java8的splitIterator特性 我已经编写了以下代码,我的要求是无论何时调用get();get方法应该从itr3返回一个值;有可能得到同样的结果吗?怎么做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
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感谢您共享代码。你能说说你的代码的好处吗?