Java 8 流 API,用于查找与属性值匹配的唯一对象 findAny & orElse

2022-08-31 10:17:54

使用 Java 8 流查找与集合中的属性值匹配的对象。

List<Person> objects = new ArrayList<>();

人员属性 - >姓名、电话、电子邮件。

循环访问人员列表并查找与对象匹配的电子邮件。看到这可以通过Java 8流轻松完成。但这仍然会返回一个集合吗?

前任:

List<Person> matchingObjects = objects.stream.
    filter(p -> p.email().equals("testemail")).
    collect(Collectors.toList());

但我知道它总是有一个唯一的对象。我们可以做些什么,而不是让我直接得到实际的对象。而不是获取对象列表。Collectors.toList


答案 1

与其使用收集器,不如尝试使用 或 。findFirstfindAny

Optional<Person> matchingObject = objects.stream().
    filter(p -> p.email().equals("testemail")).
    findFirst();

这将返回 一个,因为列表可能不包含该对象。Optional

如果您确定列表中始终包含该人员,则可以致电:

Person person = matchingObject.get();

不过要小心! 如果不存在任何值,则抛出。因此,强烈建议您首先确保该值存在(使用 或更好,使用 , 或类中找到的任何其他替代项)。getNoSuchElementExceptionisPresentifPresentmaporElseOptional

如果没有这样的人,你可以参考,那么:null

Person person = matchingObject.orElse(null);

如果可能的话,我会尽量避免使用参考路线。Optional 类(等)中的其他替代方法可以解决许多用例。我发现自己使用的地方是,只有当我有现有的代码,这些代码在某些情况下被设计为接受引用。nullifPresentmaporElse(null)null


可选选项还有其他有用的方法。看看 Optional javadoc


答案 2

findAny & orElse

通过使用 findAny()orElse()

Person matchingObject = objects.stream().
filter(p -> p.email().equals("testemail")).
findAny().orElse(null);

在发现事件后停止寻找。

findAny

Optional<T> findAny()

返回描述流中某些元素的 Optional,如果流为空,则返回空的 Optional。这是一个短路端子操作。此操作的行为是显式非确定性的;可以自由选择流中的任何元素。这是为了在并行操作中实现最佳性能;代价是在同一源上的多次调用可能不会返回相同的结果。(如果需要稳定的结果,请改用 findFirst()。


推荐