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

标签 java filter java-8 java-stream

使用 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 以便我直接获得实际对象。而不是获取对象列表。

最佳答案

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

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

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

如果您确定列表中始终包含您可以调用的人:

Person person = matchingObject.get();

但要小心! 如果不存在任何值,get 会抛出 NoSuchElementException。因此强烈建议您首先确保该值存在(使用 isPresent 或更好,使用 ifPresentmap orElseOptional 类中的任何其他替代项)。

如果没有这样的人,你对 null 引用没问题,那么:

Person person = matchingObject.orElse(null);

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


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

关于Java 8 Stream API 查找与属性值匹配的唯一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33992479/

相关文章:

java - 函数式 java 8 与传统 java

java - 为什么liquibase :diff returning "A reference database must be provided to perform a diff"?

java - 使用 TCP 连接的 Spring 方式是什么?

java - 尝试从 Java 创建 SQL 表时出现语法错误

java - 由插件定义的 JAXB 编码/解码对象

使用wireshark显示过滤器过滤流量

Excel VBA过滤和删除

Git Parameter Plugin - 过滤分支

java - 从 web.xml 文件获取初始化参数。在 Eclipse 和 Tomcat 中

使用方法体的 Java 8 谓词仅被调用一次?