Обходной путь - заставить Stream
, созданный getGenerator
, быть оцененным в реализации метода flatMap
. Это заставляет NullPointerException
быть брошенным в блоке try
- catch
и, следовательно, может быть обработано.
Для этого вы можете collect
Stream
(например, List
):
getGenerator(chance, 20).collect(Collectors.toList()).stream()
Включение этого в ваш оригинальный фрагмент:
public class FlatMap {
public static void main(final String[] args) {
long count;
// trying to catch the exception in flatMap() will not work
count = Stream.of(0.2, 0.5, 0.99)
.flatMap(chance -> {
try {
return getGenerator(chance, 20).collect(Collectors.toList()).stream();
}
catch (final NullPointerException e) {
return Stream.empty();
}
})
.count();
System.out.println(count);
}
// !! we cannot change this method, we simply get a Stream
static Stream<Object> getGenerator(final double chance, final long limit) {
return Stream.generate(() -> {
if (Math.random() < chance) return new Object();
throw new NullPointerException();
}).limit(limit);
}
}
Предупреждение : этот подход может снизить производительность, если getGenerator
Stream
будет лучше оценивать лениво.