我有以下代码,并想使用 lambda 函数来实现它,只是为了好玩。可以使用基本的聚合操作来完成吗?
List<Integer> result = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
if (10 % i == 0) {
result.add(i);
if (i != 5) {
result.add(10 / i);
}
}
}
使用 lambda:
List<Integer> result = IntStream.rangeClosed(1, 10)
.boxed()
.filter(i -> 10 % i == 0)
// a map or forEach function here?
// .map(return 10 / i -> if i != 5)
.collect(Collectors.toList());
最佳答案
这里的基本观察是您的问题涉及非同构转换:单个输入元素可能映射到零、一个或两个输出元素。每当您注意到这一点时,您应该立即开始寻找涉及 flatMap
而不是 map
的解决方案,因为这是实现这种通用转换的唯一方法。在您的特定情况下,您可以首先将 filter
应用于一对零元素映射,然后将 flatMap
应用于一对二映射:
List<Integer> result =
IntStream.rangeClosed(1, 10)
.filter(i -> 10 % i == 0)
.flatMap(i -> i == 5 ? IntStream.of(i) : IntStream.of(i, 10 / i))
.boxed()
.collect(toList());
(假设 import static java.util.stream.Collectors.toList
)
关于java - 如何使用 Java 8/lambda 执行嵌套的 'if' 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31629324/