Нахождение первого элемента, который удовлетворяет условию до этого элемента в потоке - PullRequest
0 голосов
/ 13 мая 2019

У меня есть список элементов, которые могут содержать скобки (в их свойстве 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 Ответ

2 голосов
/ 13 мая 2019

Использование проверки 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...