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

Luc*_*ess 21 java lambda functional-programming nested-if java-8

我有以下代码,并希望使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用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());
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 48

这里的基本观察是你的问题涉及非同构变换:单个输入元素可以映射到零个,一个或两个输出元素.每当你注意到这一点时,你应该立即开始寻找一个解决方案,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());
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你不仅要回答这个问题,还要教会如何考虑问题来解决问题. (3认同)

Vin*_*igh 5

你可以为lambda声明一个body.例如:

Runnable run = () -> System.out.println("Hey");
Run Code Online (Sandbox Code Playgroud)

可能

Runnable run = () -> {
    System.out.println("Hey");
};
Run Code Online (Sandbox Code Playgroud)

在该主体中,您可以创建嵌套语句:

Runnable run = () -> {
    int num = 5;

    if(num == 5) {
        System.out.println("Hey");
    }
};
Run Code Online (Sandbox Code Playgroud)