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

San*_*osh 44 java filter java-8 java-stream

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

List<Person> objects = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

人员属性 - >姓名,电话,电子邮件.

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

例如:

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

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

Ind*_*Ots 94

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

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

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

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

Person person = matchingObject.get();
Run Code Online (Sandbox Code Playgroud)

如果您不确定并且想要获得get如果没有这样的人,那么:

Person person = matchingObject.orElse(null);
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然我建议尽可能不使用orElse(null). (5认同)

Bij*_*ain 10

findAnyorElse

通过使用findAny()orElse()

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

找到事件后停止寻找。

findAny

Optional<T> findAny()

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


Sah*_*bra 5

番石榴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());
Run Code Online (Sandbox Code Playgroud)