findfirst返回optional以安全获取流首元素,推荐用orelse等方法避免异常;与findany不同,它保证顺序,常配合filter查找首个匹配项。

findFirst 是 Java Stream API 中用于获取流中第一个元素的方法,它返回一个 Optional 类型结果,避免空指针异常。
基本用法:直接获取第一个元素
对非空流调用 findFirst(),会返回包含首个元素的 Optional;空流则返回空的 Optional。必须通过 isPresent() 判断或使用安全方法(如 orElse())提取值。
-
不推荐:直接调用
get()(可能抛NoSuchElementException) -
推荐:用
orElse(null)、orElseThrow()或ifPresent()
常见写法示例
以下是最常用的安全获取方式:
List<string> list = Arrays.asList("a", "b", "c");
String first = list.stream().findFirst().orElse("default"); // 返回 "a"
List<integer> empty = Collections.emptyList();
Integer firstOrNull = empty.stream().findFirst().orElse(null); // 返回 null
// 或者指定异常
Integer firstOrEx = list.stream().findFirst()
.orElseThrow(() -> new RuntimeException("列表为空"));
</integer></string>
注意:findFirst 与 findAny 的区别
findFirst() 保证返回「按流顺序的第一个元素」,适用于有序流(如 List、数组生成的流);findAny() 不保证顺序,适合并行流(性能更好),但结果不确定。
- 串行流中两者行为一致,但语义不同:
findFirst强调顺序性 - 并行流中
findFirst仍保持顺序约束,可能牺牲性能
配合过滤使用(推荐场景)
常与 filter() 连用,查找满足条件的第一个元素:
List<person> people = ...;
Person firstAdult = people.stream()
.filter(p -> p.getAge() >= 18)
.findFirst()
.orElse(null);
</person>
这种写法简洁高效,底层不会遍历全部元素——一旦找到匹配项就立即终止。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











