findFirst() 返回 Optional 是为安全处理流为空的情况,避免空指针异常;非空时返回 Optional.of(element),为空时返回 Optional.empty(),推荐用 orElse()、orElseGet()、orElseThrow() 或 ifPresent() 安全获取值。

findFirst() 是 Java Stream 中用于获取流中第一个元素的方法,它返回一个 Optional 类型结果,用来安全地处理可能为空的情况。
为什么必须用 Optional 包装?
因为 Stream 可能为空(比如过滤后没匹配项、空集合转换的流),直接返回元素会导致空指针风险。Optional 强制你显式处理“不存在”的情况。
- 如果流非空,
findFirst()返回包含第一个元素的Optional.of(element) - 如果流为空,返回
Optional.empty()
常用获取方式(推荐安全写法)
不要直接调用 get(),避免抛出 NoSuchElementException:
-
有默认值时用
orElse():stream.findFirst().orElse("default") -
需计算默认值时用
orElseGet()(延迟执行,更高效):stream.findFirst().orElseGet(() -> computeDefault()) -
明确无默认值且允许空时用
orElseThrow():stream.findFirst().orElseThrow(() -> new RuntimeException("No element found")) -
需要进一步处理时用
ifPresent():stream.findFirst().ifPresent(System.out::println)
结合过滤和排序的实际例子
findFirst 常配合 filter、sorted 使用,注意:它只取满足条件的第一个,不保证原始顺序,除非流是有序的(如 List 转换的流):
立即学习“Java免费学习笔记(深入)”;
- 找年龄最小的人:
list.stream().min(Comparator.comparing(Person::getAge))更合适(语义明确) - 找第一个偶数:
Stream.iterate(1, n -> n + 1).limit(10).filter(n -> n % 2 == 0).findFirst()→ 返回Optional[2] - 空流示例:
Stream.empty().findFirst()→ 返回Optional.empty()
注意并行流中的行为
在并行流中,findFirst() 仍保证返回“遇到的第一个”元素(按流的遭遇顺序),但性能可能略低于 findAny()。如果只关心任意一个匹配元素,用 findAny() 效率更高。


















