Поток булевых значений, правда ли?
Я хочу распараллелить следующий код, скомпилированный с помощью parallelStream:
boolean anyTrue() {
for (Element e : setOfE) {
if (eval(e)) {
return true;
}
}
return false;
}
Будет ли следующая работа над параллельными потоками и использовать регулярную оценку короткого замыкания?
setOfE.parallelStream().map(e -> eval(e)).reduce(false, (a,b) -> a || b))
Ответы
Ответ 1
API потоков фактически имеет первоклассную поддержку вашего требования:
setOfE.parallelStream().anyMatch(e->eval(e));
В отличие от вашего подхода с reduce
, это гарантированно будет иметь оценку короткого замыкания и оптимальное использование parallelism.
Ответ 2
Нет, сокращение не поддерживает оценку короткого замыкания. Причина в том, что reduce
просто получает произвольную реализацию BinaryOperator
и не имеет представления о возможностях короткого замыкания конкретной операции.
Но вы можете выполнить всю операцию намного проще:
setOfE.parallelStream().filter(e -> eval(e)).findAny().isPresent()
Это просто ищет произвольный элемент, для которого eval
возвращает true
и findAny
позволяет завершить операцию, как только один поток встретил совпадение. Получаемый Optional
может быть запрошен для того, чтобы быть пустым, поскольку вас не интересует конкретное соответствие Element
.
В качестве альтернативы вы можете использовать, как предлагает комментарий Марко Топольника:
setOfE.parallelStream().anyMatch(e -> eval(e))