为何全为null元素的Stream返回true?过滤null后逻辑解析
isNotValidCeo方法疑问解答
一、为什么流中全为null元素时方法返回true?
当列表里的元素全是null时,filter(Objects::nonNull)会把所有元素都过滤掉,得到一个空流。而Stream的allMatch方法对空流的判定逻辑是默认返回true——因为空流里没有任何元素能违反“所有元素都为null”的条件,这种情况在逻辑上被认定为“命题成立”,所以allMatch(Objects::isNull)返回true,最终方法整体返回true。
二、方法的完整执行逻辑
- 前置判断:先通过
CollectionUtils.isEmpty(ceos)检查列表是否为空,若为空直接返回true。 - 流处理流程:
- 把列表转为Stream,通过
filter(Objects::nonNull)过滤掉所有null的Ceo实例,只保留非null对象。 - 对保留的非null Ceo对象,调用
Ceo::getSuperBonus提取其superBonus属性。 - 用
allMatch(Objects::isNull)判断所有提取出的superBonus是否都为null:- 如果所有superBonus都是null,返回true;
- 只要有一个superBonus不为null,就返回false。
- 把列表转为Stream,通过
三、执行null过滤操作后的行为
filter(Objects::nonNull)会逐一检查流中的每个Ceo元素,仅保留非null的对象,所有null元素都会被排除,不会进入后续的map和allMatch操作。- 如果原列表全是null元素,过滤后得到空流,后续的
map操作不会执行任何转换,allMatch直接返回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); }
调试示例截图

内容的提问来源于stack exchange,提问作者Александр Берестов
相关产品推荐
相关产品推荐

