Предполагая, что я дал Stream
из Futures
, который я хочу уменьшить, вызвав метод Stream#reduce
. Но я не хочу уменьшать саму Futures
, а результат Future
(Future#get
). Проблема в том, что метод get может выдать ExecutionException
и не дает результата в этом случае.
Это причина, по которой
Stream<Future<Integer>> stream = ...;
BinaryOperator<Integer> sum = (i1, i2) -> i1 + i2;
stream.map(future -> future.get())
.reduce(sum); // does not work, get needs to handle exceptions!
Итак, я должен поймать исключения:
stream.map(future -> {
Integer i = null;
try {
i = future.get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {}
return i;
}).reduce(sum);
Но при таком подходе у меня могут возникнуть проблемы, потому что могут появиться значения null
.
Итак, чтобы избавиться от них, я пришлось бы отфильтровать те, где появился ExecutionException
:
stream.filter(future -> {
Integer i = null;
try {
i = future.get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
return i != null;
})
.map(future -> {
Integer i = null;
try {
i = future.get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
return i;
}).reduce(sum);
Я думаю, этот код будет работать .. Но я не хочу верить, что это единственный и самый умный способ уменьшить фьючерсы.
Есть идеи или предложения?