2017-07-04 11 views
2

私はJava 8の新機能で、java8のsplitIterator機能を理解しようとしています。Java8のspliteratorでtryAdvanceメソッドから値を返す方法は?

私は以下のコードを書いています。私の要求はget(); getメソッドはitr3から1つの値を返します。それを得ることは可能ですか?そしてどうやって?

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

私はあなたを誤解しないでください。スプライテータの要素を収集するコレクタオブジェクトが必要です。例えば:

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

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

System.out.println(collector); 
+2

代わり '一方(itr3.tryAdvance(コレクタ::追加))の:

Integer[] collector = new Integer[1]; boolean exist = itr3.tryAdvance(value -> collector[0] = value); System.out.println(collector[0]); 

ORは、例えば、別のListを用いてspliterator内のすべての要素を集めます; 'itr3.forEachRemaining(collector :: add);を使うことができます。これは、(特定の' Spliterator'によってオーバーライドされた場合)正確に潜在的により効率的な方法で同じ( 'デフォルト'の実装)または意味的に同じことを行います。 – Holger

+0

ええ、私はそれを忘れています。私に思い出させてくれてありがとう。 –

+2

私は、スプライテータから1つの要素を収集するこのタスクでは、 'Consumer'を実装する' Holder'クラスを使用する人がいることを見てきました:class HoldConsumer はコンシューマ {private T t; public void accept(T t){this.t = t; } public T get(){戻りt; }} ' –

関連する問題