使用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
,以便我直接得到实际的对象。而不是获取对象列表。
答案 0 :(得分:76)
请尝试使用findFirst
或findAny
。
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)
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