У меня есть этот код ниже.Вызов findfirst
выбрасывает NullPointerException
, хотя у меня orElseGet
прикован вызов
int numberOfRetry = 5;
String req = "abc";
String res =
Stream.iterate(0, n -> n + 1).map(i -> {
try {
return req.substring(numberOfRetry - i);
} catch (Exception e) {
// log exception
}
return null;
})
.limit(1)
.findFirst()
.orElseGet(() -> "Exception");
Тем не менее, он работает нормально, если я вызову фильтра, как показано ниже:
int numberOfRetry = 5;
String req = "abc";
String res =
Stream.iterate(0, n -> n + 1).map(i -> {
try {
return req.substring(numberOfRetry - i);
} catch (Exception e) {
// log exception
}
return null;
})
.limit(1)
.filter(Objects::nonNull)
.findFirst()
.orElseGet(() -> "Exception");
Я полагаю, что мы не можем явно вернуть null
в некоторых ситуациях, и не совсем понятно, что это за ситуации на первый взгляд.В первом случае он возвращает stream
с элементом null
, который выбрасывает NullPointerException
, во втором случае возвращает пустой поток, который работает нормально.