代码之家  ›  专栏  ›  技术社区  ›  Sahand

在流中找到满足条件的第一个元素

  •  0
  • Sahand  · 技术社区  · 7 年前

    我有一个可能包含括号的元素列表(在它们的 value 属性)。这段代码在每个元素中创建一个平衡出现的列表(左括号-右括号),然后查找平衡小于或等于0的第一个索引(即所有括号都是第一个闭合的)。

    List<Integer> parenthesisBalancePerElement = paragraphElements.stream()
                    .map(paragraphElement -> checkBalancedOccurences(paragraphElement, "(", ")"))
                    .collect(Collectors.toList());  
    
    int balance = 0;
    int firstIndexWhereClosed;
    for (firstIndexWhereClosed = 0; firstIndexWhereClosed < parenthesisBalancePerElement.size(); firstIndexWhereClosed++) {
        int elementBalance = parenthesisBalancePerElement.get(firstIndexWhereClosed);
        balance += elementBalance;
        if (balance <= 0) {
            break;
        }
        // use firstIndexWhereClosed
    }
    

    代码的第二部分使用for循环,比第一部分更难读取。有没有更干净的方法来做到这一点,可能是使用流?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Zircon    7 年前

    你对支票的使用 balance 当您在元素上迭代时,使这个循环成为有状态的操作,这对于流是不鼓励的。

    // find the index of the last operation that brings balance below 0
    int balance = 0;
    int firstIndexWhereClosed = 0;
    for (; balance >= 0 && firstIndexWhereClosed < parenthesisBalancePerElement.size(); firstIndexWhereClosed++) {
        int elementBalance = parenthesisBalancePerElement.get(firstIndexWhereClosed);
        balance += elementBalance;
    }
    // use firstIndexWhereClosed
    
    推荐文章