【发布时间】:2018-08-21 12:52:17
【问题描述】:
如何使用java8流过滤列表并返回找到的元素,如果它是过滤列表中唯一的元素,否则(如果满足条件的元素更多,或者没有满足条件的结果)返回例如Optional.empty()
我需要这样的东西:
假设我有一个:
List<String> list = Arrays.asList("Apple","Banana","Peach");
那我想要:
Optional<String> string = list.stream()
.filter(item -> item.startsWith("A"))
.findOne();
我知道我可以这样做:
boolean singleElement = list.stream()
.filter(item -> item.startsWith("A"))
.count() == 1;
String string = null;
if(singleElement){
string = list.stream().filter(item -> item.startsWith("A")).iterator().next();
}
但我想知道是否可以在单个流中完成?
有没有单流解决方案?
【问题讨论】:
-
您可以将
limit流到2,将其收集到一个列表中,然后检查它是否恰好是一个元素。这仍然有不止一行,但你没有做任何多余的工作。 -
在我看来,重复问题的最佳答案是this one。
-
@Sunflame linked answer 的第二部分应该返回一个
Optional,没有例外。 -
@Socowi 这也是我的想法,但我尝试使用
reduce,但没有成功。将其添加到我的答案中,只是为了完整性。
标签: java filter java-8 java-stream