在Java 8中使用流和lambda使用if-else条件

时间:2019-03-09 10:24:27

标签: java lambda foreach java-8 java-stream

我已经阅读了这篇帖子How to use if-else logic in Java 8 stream forEach

Java 8的全部重点是编写更优雅,可读性和简洁性的代码。 我重写了利用Java 8 Streams和Lambda的execute方法,但是最终得到的结果与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中,还有一种更优雅的方法吗?

1 个答案:

答案 0 :(得分:1)

可以在这里完成的工作不多,流非常适合映射,过滤,聚合和收集...在这里,您仅会对每个元素产生副作用。您可能想通过应用映射来使用流的某些功能:

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