java - 如何使用 Java 8/lambda 执行嵌套的 'if' 语句?

标签 java lambda java-8 functional-programming nested-if

我有以下代码,并想使用 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/

相关文章:

java - 在将字符串发送到服务器之前压缩它

android - Android 中模拟 kotlin 函数作为参数

c# - Linq vs Lambda-Expressions 查询执行和执行查询中的 "1 AS [C1]"meening

java - maven 。 -source 1.5 不支持 lambda 表达式

java - 基于对象的不同可空字段的比较器

spring - JPA 中的 Java 8 日期时间 API

java - MongoDb Criteria 查询 LTE 不适用于数字

java - Peapod : Impl is not abstract and does not override abstract method start() in peapod. FramedVertexTraversal

java - 你知道一个好的并发谜题网站吗?

java - BinaryOperator 的身份