【问题标题】:Using if-else condition in Java 8 using streams and lambda使用流和 lambda 在 Java 8 中使用 if-else 条件
【发布时间】:2019-03-09 10:24:26
【问题描述】:

我已阅读这篇文章How to use if-else logic in Java 8 stream forEach

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 中有没有更优雅的方式来做到这一点?

【问题讨论】:

  • 一个常见的误解是,当您使用流时,一切都会“变得更加优雅”。这段代码现在非常好,你不应该替换代码中的 every for 循环来使用流。
  • 你可能对String中的chars()方法感兴趣。
  • 您还应该注意,您的流版本和您的初始 Java 7 解决方案不会这样做。在第一个版本中,如果!matches(stack.pop(), c),您可以提前退出。这在流版本中没有了。
  • @dpr 是的,两个版本产生相同的结果,但处理方式不同。我认为 Java 8 会更慢,因为它必须遍历列表中的所有项目。这是因为您不能使用forEach 获得breakreturn。但是,最后stack.isEmpty() 可以是真也可以是假。我决定使用 Java 7 版本。
  • 赞成不转换为流。

标签: java lambda java-8 functional-programming java-stream


【解决方案1】:

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

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

【讨论】:

  • 使用expression.chars() 在字符上获取IntStream 而不先将所有内容复制到数组中会更有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2018-06-02
  • 1970-01-01
  • 2018-09-26
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多