You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:45:02