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
而不是使用收集器尝试使用findFirst或findAny.
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.
Bij*_*ain 10
findAny 和 orElsePerson 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()。)
番石榴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)
| 归档时间: |
|
| 查看次数: |
80288 次 |
| 最近记录: |