У меня есть простой метод валидатора. Почему поток нулевых элементов возвращает true? Как это работает?
Что происходит после фильтрации по нулю?
private static boolean isNotValidCeo(List<Ceo> ceos) {
if (CollectionUtils.isEmpty(ceos)) {
return true;
}
return ceos.stream()
.filter(Objects::nonNull)
.map(Ceo::getSuperBonus)
.allMatch(Objects::isNull);
}

См. также Пустая истина
Вы фильтр удаляете нули, но без кода getSuperBonus нет никакой подсказки относительно того, содержит ли поток нули или нет впоследствии.
allMatch(isNull) эквивалентно noneMatch(nonNull) или !anyMatch(nonNull), что означает, что оно пройдет, если не будет элемента, отличного от NULL.




.filter(Objects::nonNull) приводит к пустому набору, а allMatch для пустого набора является истиной, поскольку нет элементов, противоречащих правилу.
Поток пуст при вызове allMatch (поскольку все значения были отфильтрованы .filter(Objects::nonNull)). allMatch в пустом потоке всегда возвращает true.
Такое поведение allMatch описано в JavaDocs метода:
Примечание API:
Этот метод оценивает универсальную количественную оценку предиката по элементам потока (для всех x P(x)). Если поток пуст, говорят, что квантификация пусто удовлетворена и всегда равна
true(независимо от P(x)).[…]
Возврат:
trueесли либо все элементы потока соответствуют предоставленному предикату, либо поток пуст, в противном случаеfalse
проверьте документацию из
allMatch(): «Возвращает:trueесли либо... или поток пуст»