Подтвердить что ты не робот

Поток булевых значений, правда ли?

Я хочу распараллелить следующий код, скомпилированный с помощью 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))
4b9b3361

Ответ 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))