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

时间:2015-11-30 06:16:27

标签: java filter java-8 java-stream

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

List<Person> objects = new ArrayList<>();

人物属性 - &gt;姓名,电话,电子邮件。

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

前:

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

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

3 个答案:

答案 0 :(得分:76)

请尝试使用findFirstfindAny

,而不是使用收藏家
Optional<Person> matchingObject = objects.stream().
    filter(p -> p.email().equals("testemail")).
    findFirst();

这会返回Optional,因为列表可能不包含该对象。

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

Person person = matchingObject.get();

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

Person person = matchingObject.orElse(null);

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

答案 1 :(得分:5)

findAnyorElse

通过使用findAny()orElse()

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

在找到事件后停止搜索。

  

findAny

     

Optional<T> findAny()

     

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

答案 2 :(得分:3)

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

如果流包含两个或更多元素,则返回的收集器会抛出 .foo { position:relative; width:500px; height:500px; } .foo img { width:100%; vertical-align:top; } .foo:after, .foo:before { position:absolute; opacity:0; transition: all 0.3s; -webkit-transition: all 0.3s; } .foo:after { content:'\A'; width:100%; height:100%; top:0; left:0; background:rgba(0,0,0,0.8); } .foo:before { content: attr(data-content); color:#fff; z-index:1; padding:4px 10px; text-align:center; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .foo:hover:after, .foo:hover:before { opacity:1; } #box{ background-color: red; } .btn { position: relative; z-index: 1; display: none; } .foo:hover .btn{ display: inline-block; },如果流,则返回<div id="box" class="foo" data-content="Caption"> <button class="btn">view</button> </div>是空的

请参阅以下代码以供使用:

IllegalArgumentException