2017-07-31 8 views
2

私はReactiveの初心者です。 JDK 1.8を使用して、これらの必須コードをReactiveスタイルに変換する方法を教えてください。if/else in Reactive JDK 8

List<int> evenArr, oddArr, arr; 
// pretending 'arr' have some values, 'evenArr' & 'oddArr' have already init 
for (int n : arr) { 
    if (n%2) evenArr.add(n); 
    else oddArr.add(n); 
} 

今私は検索のように、二回 'ARR' だけのアイデアを持っている:

arr.stream().filter(n -> n%2).foreach(evenArr::add); 
arr.stream().filter(n -> n%2!=0).foreach(oddArr::add); 

は別の方法はありますか? 'arr'を2回検索するのは高価です。

答えて

5

このようにCollectors.partitioningByを使用してください。

List<Integer> arr = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); 
Map<Boolean, List<Integer>> result = arr.stream() 
    .collect(Collectors.partitioningBy(i -> i % 2 == 0)); 
List<Integer> evenArr = result.get(true); 
List<Integer> oddArr = result.get(false); 
System.out.println("evenArr=" + evenArr); 
System.out.println("oddArr=" + oddArr); 

結果

evenArr=[0, 2, 4, 6, 8] 
oddArr=[1, 3, 5, 7, 9] 
+0

おかげ配列を検索したくない場合には、Collectors.groupingByで偶数/奇数のことを行うことができます。 –

4

あなたは概念を誤解しているためReactive programmingが何であるかについての詳細をお読みください。 とにかく、あなたは二回キーワード「コレクター」の2つのあなた

Map<Boolean, List<Integer>> collect = arr.stream() 
       .collect(Collectors.groupingBy(o -> o % 2 == 0)); 
+0

うんうん。私は2回の検索が間違っていることを知っていますが、正しく書き込むことはできません。 –