Java findAny()、findFirst()空指针NullPointerException问题

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(); #使用前先去空
}