首页 > 解决方案 > 使用流和 lambda 在 Java 8 中使用 if-else 条件

问题描述

我已阅读这篇文章如何在 Java 8 流 forEach 中使用 if-else 逻辑

Java 8 的重点是编写更优雅、可读和简洁的代码。我使用 Java 8 Streams 和 Lambda 重写了这个执行方法,但我最终得到的结果看起来与 Java 7 版本没有任何不同。

private static boolean execute(String expression) {
    Deque<Character> stack = new ArrayDeque<>();
    for (char c : expression.toCharArray()) {
        if (isOpenToken(c)) {
            stack.push(c);
        } else if (stack.isEmpty() || !matches(stack.pop(), c)) {
            return false;
        }
    }
    return stack.isEmpty();
}

这就是该方法现在在 Java 8 中的样子

private static boolean execute(String expression) {
    char[] a = expression.toCharArray();
    Deque<Character> stack = new ArrayDeque<>();
    IntStream.range(0, a.length).forEach(i -> {
        if (isOpenToken(a[i])) {
            stack.push(a[i]);
        } else {
            matches(stack.pop(), a[i]);
        }
    });
    return stack.isEmpty();
}

在 Java 8 中有没有更优雅的方法来做到这一点?

标签: javalambdajava-8functional-programmingjava-stream

解决方案


不多,可以在这里完成,流非常适合映射、过滤、聚合、收集......在这里你只对每个元素都有副作用。您可能想通过应用映射来使用流的一些功能优势:

IntStream.range(0, a.length).map(i -> a[i]).forEach(el -> {
    if (isOpenToken(el)) {
        stack.push(el);
    } else {
        matches(stack.pop(), el);
    }
});

推荐阅读