Java findAny()、findFirst()空指针NullPointerException问题
在写代码调试时,发生空指针异常,定位代码是在使用stream()的findFirst()出报错
原因
如果 选择元素为null则会报NullPointerException
@throws NullPointerException if the element selected is null
/**
* Returns an {@link Optional} describing the first element of this stream,
* or an empty {@code Optional} if the stream is empty. If the stream has
* no encounter order, then any element may be returned.
*
* @return an {@code Optional} describing the first element of this stream,
* or an empty {@code Optional} if the stream is empty
* @throws NullPointerException if the element selected is null
*/
Optional<T> findFirst();
示例
userDO.getIdentitys().stream().filter(i -> platform.equals(i.getPlateform()))
.map(IdentityDO::getTeamName).findFirst().orElse(""));# map映射后的元素可能为null,接着调用findFirst就会报错
# 正确用法
userDO.getIdentitys().stream().filter(i -> platform.equals(i.getPlateform()))
.findFirst().map(IdentityDO::getTeamName).orElse(""));# 在确定stream中不存在null对象后,findFirst,findAny尽量在其他流操作前使用,避免由于其他流操作导致null值的情况
private static void testFindFirst(){
List<String> list=Arrays.asList(null,"2");
Optional<String> first=list.stream().findFirst();# null直接调用findFirst会报错
Optional<String> first=list.stream().filter(Objects::nonNull).findFirst(); #使用前先去空
}