当前位置: 首页 > 知识库问答 >
问题:

Java8过滤并返回if only元素

戚默
2023-03-14

如何使用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();
}

但我想知道我是否可以在一个单一的流中做到这一点?

有单一的流解决方案吗?

共有1个答案

呼延臻
2023-03-14

不是很漂亮,但是您可以限制流为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

  • 我当前正在过滤一个流,但是如果过滤器没有返回任何匹配项,我想返回一个默认值。这是在附加流的链中,所以我使用它来避免在一个步骤没有任何结果时链停止。 目前,我正在通过将筛选结果收集到一个列表中来伪造它,如果列表为空,请创建新的默认列表并将其作为流返回。如果列表不为空,则将结果转换回流以将其传递回。 有什么更流的方式来实现这一点,而不需要去列表和返回流?