如何实现NullSafe的两个Stream拼接,避免空值抛出错误?
Java Stream 空安全拼接方案
完全不需要手写多层if判空,有几种简洁的空安全拼接实现方式:
基础通用方案(兼容Java 8及以上版本)
用Optional将可能为null的Stream替换为空Stream,再执行拼接:import java.util.Optional; import java.util.stream.Stream; // 你的原有代码 Stream<Integer> guests = code+some_method(); Stream<Integer> guestsTravelWith = code+some_method(); // 空安全拼接实现 Stream<Integer> result = Stream.concat( Optional.ofNullable(guestsTravelWith).orElseGet(Stream::empty), Optional.ofNullable(guests).orElseGet(Stream::empty) );如果需要拼接的Stream数量超过2个,更推荐用批量过滤+展开的写法,避免嵌套多层
Stream.concat:import java.util.Objects; import java.util.function.Function; import java.util.stream.Stream; Stream<Integer> result = Stream.of(guestsTravelWith, guests) .filter(Objects::nonNull) .flatMap(Function.identity());Java 9+ 简化写法
Java 9新增了Stream.ofNullable方法,可以进一步简化判空逻辑:Stream<Integer> result = Stream.concat( Stream.ofNullable(guestsTravelWith).flatMap(Function.identity()), Stream.ofNullable(guests).flatMap(Function.identity()) );可复用工具类封装
如果你经常需要用到空安全拼接,可以封装通用工具方法,支持任意数量Stream的拼接:import java.util.Arrays; import java.util.Objects; import java.util.function.Function; import java.util.stream.Stream; public class StreamUtils { public static <T> Stream<T> nullSafeConcat(Stream<T>... streams) { return Arrays.stream(streams) .filter(Objects::nonNull) .flatMap(Function.identity()); } } // 调用示例 Stream<Integer> result = StreamUtils.nullSafeConcat(guestsTravelWith, guests);
内容的提问来源于stack exchange,提问作者Jishnu Prathap
相关产品推荐
相关产品推荐

