283. Java Stream API - 创建一个空的 Stream

283. Java Stream API - 创建一个空的 Stream


✅ 什么是空流?

空流(empty stream)就是不包含任何元素的 Stream。创建方式非常简单,使用 Stream.empty() 工厂方法即可。


🧪 示例:创建一个空流

Stream<String> empty = Stream.empty();
List<String> strings = empty.toList();
System.out.println("strings = " + strings);

输出结果:

strings = []

就这么简单,一行代码就能创建出一个什么都不包含的流!


💡 空流的使用场景

你可能会问:这有啥用?其实,空流在写可组合代码时非常有用!

以下是几个典型的使用场景:


🎯 场景 1:避免空指针异常(NullPointerException)

List<String> list = null;

// 错误写法:会抛出 NPE
// list.stream().forEach(System.out::println);

// 安全写法:使用 Optional + 空流兜底
Stream<String> safeStream = Optional.ofNullable(list)
                                    .map(List::stream)
                                    .orElse(Stream.empty());

safeStream.forEach(System.out::println); // 什么也不打印,但程序不会挂

🎯 场景 2:流式拼接时动态返回空流

比如你从某个数据源中获取一批数据,有时候会返回空结果,但你仍然想继续拼接或操作后续流:

Stream<String> dbResults = fetchFromDB(); // 假设这里可能返回空
Stream<String> merged = Stream.concat(dbResults, Stream.of("default"));

merged.forEach(System.out::println);

如果 fetchFromDB() 返回 Stream.empty(),也不会出错,你依然能打印出默认值。


🎯 场景 3:在 flatMap() 中用于“条件跳过”

假设我们在做嵌套数据处理,不满足条件的直接返回空流跳过:

Stream<String> words = Stream.of("apple", "banana", "pear");

Stream<Character> letters = words.flatMap(word -> {
    if (word.length() < 5) return Stream.empty();
    return word.chars().mapToObj(c -> (char) c);
});

letters.forEach(System.out::println);

输出:

a
p
p
l
e
b
a
n
a
n
a

小于 5 个字符的单词 "pear" 被跳过了(因为返回的是 Stream.empty())。


🚀 Java 16:推荐替代方案 — mapMulti()

Java 16 开始,推荐使用 mapMulti() 来代替 flatMap + empty 组合,它效率更高、语义更清晰。

示例对比:

List<String> words = List.of("apple", "banana", "pear");

Stream<Character> chars = words.stream().<Character>mapMulti((word, consumer) -> {
    if (word.length() >= 5) {
        for (char c : word.toCharArray()) {
            consumer.accept(c);
        }
    }
});

chars.forEach(System.out::println);

作用同上,但避免了返回中间流对象,更加轻量!


🧠 小结

方法 用途
Stream.empty() 创建一个不包含任何元素的流
用于 Optional.orElse() 安全处理可能为 null 的集合
用于 flatMap 在流中“跳过”某些不符合条件的元素
Java 16+ 的 mapMulti() 推荐替代 flatMap + empty 的高效方式
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容