(Ответ на оригинальный вопрос )
Это не похоже на хороший подход. Вы просто объединяете некоторые наборы.
Если вы не можете изменить подпись combineResult
, вы можете сделать:
ImmutableSet<Integer> seed =
Stream.concat(
initialSet.stream(),
accumulators.stream()
// Essentially just extracting the set from each accumulator.
// Adding a getter for the set to the Accumulator class would be clearer.
.map(a -> a.combineResult(Collections.emptySet()))
.flatMap(Set::stream))
.collect(ImmutableSet.toImmutableSet());
Для обобщенного combineResult
, Вы не должны использовать reduce
, потому что эта операция может быть неассоциативной.
В этом случае просто использовать простой старый l oop.
Set<Integer> seed = ImmutableSet.of(1, 2);
for (Accumulator a : accumulators) {
seed = a.combineResult(seed);
}
Это позволяет избежать основной проблемы, связанной с вашим текущим подходом, а именно локальностью без потоков состояния вычисления (то есть другие потоки и предыдущие вызовы l oop не могут повлиять на текущий вызов).