如何使用Streams而不是包含变量的循环?

时间:2019-05-02 10:50:27

标签: java

我创建了一段代码,检查一组括号中的字符串是否平衡。例如,

测试1.输入:()())(,输出:“不平衡”。
测试2.输入:(),输出:“平衡”

我想使用流而不是for循环。循环中有一个变量,用于检查一个条件,并在需要时中断“计数器”。我不知道如何以流格式包含此变量。

谢谢您的帮助。

public String findBalance(String input) {
    String[] arr = input.split("");

    Integer counter = 0;

    for (String s : arr) {
        counter += s.equals("(") ? 1 : -1;
        if (counter < 0) break;
    }
    return counter == 0 ? "Balanced" : "Not Balanced";
}

2 个答案:

答案 0 :(得分:1)

流式传输不适合。问自己,如果使用parallelStream()会发生什么。您将如何处理一个简单的边缘情况?

)(

您希望检测计数何时下降到0以下,即使稍后返回。使用并行流很难做到这一点。最好按顺序处理该字符串。

流操作独立且无状态时效果最佳。有状态的操作更适合常规的for循环,就像您已经拥有的一样。

答案 1 :(得分:0)

让我们看看Stream是否适合。

  1. 依次,按字符顺序,保持一个<嵌套>嵌套栈,则需要一个计数器。 减少是可行的。 但是,代码并不是更好,更冗长,更慢。利用并行 将需要处理“ ...(”&“)...”。可能但不好。

  2. 让我们看一看更多的 parallel 方法:递归/重复地替换内部可约化表达式(redex ()

    public String findBalance(String input) {
        String s = input.replaceAll("[^()]", "");
        for (;;) {
            String t = s.replace("()", "");
            if (t.length() == s.length()) {
                break;
            }
            s = t;
        }
        return s.isEmpty();
    }
    

尽管在这里分而治之并行性是可行的,但问题是(())之类的东西需要重复。

对于Stream,人们可能会想到flatMap之类的东西。但是,流处理步骤不会重复(在当前的Java版本中),因此不容易实现。

因此,Stream解决方案不合适。

可以将递归函数与Stream结合使用,以分割传递的字符串, 使用并行Stream,但是即使使用16个内核和长度为1000的字符串也不会很快。