Java 8 Stream API 查找与属性值匹配的唯一对象

新手上路,请多包涵

使用 Java 8 Stream 从 Collection 中查找与 Property 值匹配的对象。

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

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

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

前任:

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

但我知道它总会有一个独特的对象。我们可以做点什么来代替 Collectors.toList 这样我就可以直接得到实际的对象。而不是得到对象的列表。

原文由 Santosh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

不要使用收集器,而是尝试使用 findFirstfindAny

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

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

如果您确定列表始终包含您可以致电的那个人:

 Person person = matchingObject.get();

不过要小心! get 抛出 NoSuchElementException 如果没有值存在。 Therefore it is strongly advised that you first ensure that the value is present (either with isPresent or better, use ifPresent , map , orElse 或在 Optional 类中找到的任何其他替代方案)。

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

 Person person = matchingObject.orElse(null);

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


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

原文由 Indrek Ots 发布,翻译遵循 CC BY-SA 4.0 许可协议

findAny & orElse

通过使用 findAny()orElse()

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

找到事件后停止查找。

findAny

Optional<T> findAny()

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

原文由 Bijaya Bhaskar Swain 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题