使用 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
以便我直接获得实际对象。而不是获取对象列表。
最佳答案
尝试使用 findFirst
或 findAny
,而不是使用收集器。
Optional<Person> matchingObject = objects.stream().
filter(p -> p.email().equals("testemail")).
findFirst();
这将返回一个 可选
,因为列表可能不包含该对象。
如果您确定列表中始终包含您可以调用的人:
Person person = matchingObject.get();
但要小心! 如果不存在任何值,get
会抛出 NoSuchElementException
。因此强烈建议您首先确保该值存在(使用 isPresent
或更好,使用 ifPresent
、map
、 orElse
或 Optional
类中的任何其他替代项)。
如果没有这样的人,你对 null
引用没问题,那么:
Person person = matchingObject.orElse(null);
如果可能,我会尽量避免使用 null
引用路线。 Optional 类中的其他替代方法(ifPresent
、map
等)可以解决许多用例。我发现自己使用 orElse(null)
的地方只有当我有现有代码被设计为在某些情况下接受 null
引用时。
Optional 还有其他有用的方法。看看Optional javadoc .
关于Java 8 Stream API 查找与属性值匹配的唯一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33992479/