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

时间:2019-05-13 14:35:07

标签: java java-stream

我有一个可能包含括号的元素列表(在其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循环,比第一个IMO难读。有没有更清洁的方法(可能通过使用流)来做到这一点?

1 个答案:

答案 0 :(得分:2)

当您遍历元素时,您使用检查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