2017-07-04 145 views
2

我是Java 8的新手,並試圖瞭解java8的splitIterator功能。我寫下面的代碼,我的要求是每當我打電話get(); get方法應該從itr3返回一個值;是否有可能得到相同的?如何?如何在Java8的分割器中從tryAdvance方法返回值?

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) 

    } 

} 

回答

4

如果我沒有誤解你。您需要一個收集器收集分裂器中元素的對象。例如:

Integer[] collector = new Integer[1]; 

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

System.out.println(collector[0]); 

OR收集所有在一個spliterator的元素通過使用另一個List,例如:

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

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

System.out.println(collector); 
+2

代替'同時(itr3.tryAdvance(集電極::添加)) ;''你可以使用'itr3.forEachRemaining(collector :: add);'它可以完成相同的操作(默認實現)或者語義上相同的方式(如果被特定的'Spliterator'覆蓋)。 – Holger

+0

是的,我忘了那一個。感謝提醒我。 –

+2

我已經看到,對於從分割器中收集一個元素的任務,有些人使用實現Consumer的'Holder'類:''HoldingConsumer implements Implements Consumer {private T t; public void accept(T t){this.t = t; } public T get(){return t; }}' –