java - 响应式 JDK 8 中的 if/else

标签 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”两次的成本很高。

最佳答案

您应该像这样使用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]

关于java - 响应式 JDK 8 中的 if/else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410819/

相关文章:

Java Collect加入自定义函数

java - 递归回文检查器

java - 使用 lambda java 查找最大值

java - Java中计算大文件中以字符串开头的行的最快方法是什么

java - 两个日期之间的所有日期输出错误

java - 从 Java 8 流中以最大频率获取对象

Java 8 流、lambda

java - 理解 JViewPorts 时遇到一些困难

Java 8 流 : can you capture/reuse a value calculated in a filter?

java - 如何使用 N - 1 个相等对象 + 1 个不同对象创建 List<T>?