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
以便我直接得到实际的对象。而不是获取对象列表。
而不是使用收集器尝试使用findFirst
或findAny
。
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());
findAny
& orElse
通过使用findAny()
和orElse()
:
Person matchingObject = objects.stream(). filter(p -> p.email().equals("testemail")). findAny().orElse(null);
停止寻找发生的事情。
findAny
Optional
findAny() 返回描述流的某个元素的Optional,如果流为空,则返回空Optional。 这是一种短路终端操作。 此操作的行为明确是不确定的; 可以自由选择流中的任何元素。 这是为了在并行操作中实现最大性能; 成本是同一源上的多次调用可能不会返回相同的结果。 (如果需要稳定的结果,请改用findFirst()。)