如何使用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();
}
但我想知道我是否可以在一个单一的流中做到这一点?
有单一的流解决方案吗?
不是很漂亮,但是您可以限制
流为2个元素,收集
列表中的元素,并查看该列表是否只有一个元素。这仍然有不止一行,并且在创建列表时有一些开销,但是这种开销是有限的(仅限于大小为2的列表),而且它也不必迭代流两次。
List<String> tmp = list.stream()
.filter(item -> item.startsWith("A"))
.limit(2)
.collect(Collectors.toList());
Optional<String> res = tmp.size() == 1 ? Optional.of(tmp.get(0)) : Optional.empty();
(我的另一个想法是在limit(2)
之后使用reduce((s1,s2)->null)
,并将任何两个匹配项减少为null
,但这只会引发一个异常,即它不起作用,但这可能会触发一些更好的(有效)想法。)
UPDATE:似乎当reduce
引发异常时,collectors.reduce
不会,而是根据需要返回一个optional.empty
,因此这也是有效的,如下面一个非常相似问题的答案所示。不过,我会添加limit(2)
以使其提前停止:
Optional<String> res = list.stream()
.filter(item -> item.startsWith("A"))
.limit(2)
.collect(Collectors.reducing((s1, s2) -> null));
(如果你喜欢这最后一部分,请推翻原来的答案。)
我想过滤map列表的元素,然后在Java8+中返回map 在getEmployeeByDepartment方法中,对于映射中的每个条目,使用下面的filterEmployee方法在映射值的列表中筛选employee,返回的map1将包含映射,以便 <“tech”,list2.add(emp6)>//emp6的filterEmployee返回true 我在下面试过这个和那个,但没有成功
有一个简单的: 以及任务对象的列表。如何通过使用获得每个作为的列表。我试过这个: 但它返回
问题内容: 假设我们有一个带有字段的简单mysql表(用户): 我想获得10个具有最高评级和指定范围(50-100)薪水的用户,即在mysql中 此操作在100K用户表上运行20ms。 假设我的redis值相同:Zlist评分(rating => user_id)Zlist薪水(salary => user_id) 我使用redis看到的所有解决方案包括复制10万薪水Zlist,删除不需要的条目以
使用Java8流,当输入整数没有输出时,映射的最佳方法是什么? 简单地返回NULL?但现在我的输出列表大小将小于我的输入大小...
问题内容: 我想在 angularjs 1.2中 使用unsafe-html 。没有html的过滤器可以工作,而html则不能。我做的事: 我在我的html头中添加了angular-sanitize: 我的角度模块: 我的HTML: 编辑:更新为 问题答案: 已在Angular 1.2中删除。由于您正确地清理了输入内容,因此应该使用。 示例:http://plnkr.co/edit/0bHeXra
我当前正在过滤一个流,但是如果过滤器没有返回任何匹配项,我想返回一个默认值。这是在附加流的链中,所以我使用它来避免在一个步骤没有任何结果时链停止。 目前,我正在通过将筛选结果收集到一个列表中来伪造它,如果列表为空,请创建新的默认列表并将其作为流返回。如果列表不为空,则将结果转换回流以将其传递回。 有什么更流的方式来实现这一点,而不需要去列表和返回流?