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

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

List objects = new ArrayList(); 

人员属性 – >姓名,电话,电子邮件。

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

例如:

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

但我知道它总会有一个独特的对象。 我们可以做一些事情而不是Collectors.toList以便我直接得到实际的对象。而不是获取对象列表。

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

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

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

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

 Person person = matchingObject.get(); 

如果你不确定并且想要在没有这样的人的情况下获得null ,那么:

 Person person = matchingObject.orElse(null); 

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

Guava API提供了MoreCollectors.onlyElement( ),它是一个收集器,它接收一个只包含一个元素返回该元素

如果流包含两个或更多元素 ,则返回的收集器将抛出 IllegalArgumentException如果流为空,则返回 NoSuchElementException

请参阅以下代码以了解用法:

 import static com.google.common.collect.MoreCollectors.onlyElement; Person matchingPerson = objects.stream .filter(p -> p.email().equals("testemail")) .collect(onlyElement()); 

findAnyorElse

通过使用findAny()orElse()

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

停止寻找发生的事情。

findAny

Optional findAny()

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