if / else in Reactive JDK 8

时间:2017-07-31 08:28:20

标签: java java-8 java-stream reactive-programming

我是Reactive的新手。使用JDK 1.8,我如何将这些命令式代码转换为Reactive风格。

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 个答案:

答案 0 :(得分: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]

答案 1 :(得分:4)

你应该阅读更多关于Reactive programming的内容,因为你误解了这个概念。 无论如何,你可以使用Collectors.groupingBy做偶数/奇数事情,以防你不想两次搜索数组

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