使用Java 8 Stream从集合中查找与Property值匹配的对象 .
List<Person> objects = new ArrayList<>();
人员属性 - >姓名,电话,电子邮件 .
迭代人员列表并找到匹配电子邮件的对象 . 看到这可以通过Java 8流轻松完成 . 但那仍然会收回一个集合?
例如:
List<Person> matchingObjects = objects.stream.
filter(p -> p.email().equals("testemail")).
collect(Collectors.toList());
但我知道它总会有一个独特的对象 . 我们可以做一些事情而不是 Collectors.toList
,以便我直接得到实际的对象 . 而不是获取对象列表 .
3 回答
而不是使用收集器尝试使用
findFirst
或findAny
.这将返回
Optional
,因为列表可能不包含该对象 .如果您确定该列表始终包含您可以致电的人:
如果您不确定并且想要获得
null
如果没有这样的人,那么:Optionals还有其他有用的方法 . 看看Optional javadoc .
Guava API提供MoreCollectors.onlyElement(),这是一个收集 stream containing exactly one element 和 returns that element 的收集器 .
返回的收集器 throws 如果流 consists of two or more elements 则为
IllegalArgumentException
,如果为 stream is empty 则为NoSuchElementException
.请参阅以下代码以了解用法:
findAny&orElse
使用findAny()和orElse():
停止寻找发生的事情 .