2017-07-31 127 views
2

我是Reactive的新手。使用JDK 1.8,如何將這些命令式代碼轉換爲無效式。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); 
} 

現在我只是搜索 '常用3' 的兩倍,像想法:

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

是否有另一種方式?搜索'arr'兩次是很昂貴的。

回答

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

感謝你們兩個關鍵字「收藏家」。 –

4

你應該瞭解更多關於什麼Reactive programming是因爲你誤解了這個概念。 無論如何,你可以做的偶/奇的事情與Collectors.groupingBy,如果你不想數組兩次搜索

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

是的,你的權利。 Ofc我知道,搜索兩次是錯誤的,但我不知道寫的是否正確。 –