【问题标题】:How to collect the value directly from a stream -> filter of a list?如何直接从流中收集值 - >列表的过滤器?
【发布时间】:2017-03-21 08:26:53
【问题描述】:

Given 是需要过滤的字符串列表。我知道结果总是一个字符串。我想得到这个值。有没有比这样做更好的解决方案

List<String> bla = new ArrayList();
bla
 .stream()
 .filter(s->s.equals("something"))
 .collect(Collectors.toList())
 .get(0);

像 getOrDefault 这样的东西会很棒。

【问题讨论】:

标签: java filter java-8 java-stream


【解决方案1】:

您可以使用.findFirst()

但是,由于您确定列表中只有 1 个要搜索的元素,因此您可以使用 .findFirst().findAny(),它们会返回 Optional

然后,您只需调用此 Optional 类的 get() 即可获取您的对象。

List<String> bla = new ArrayList();

String bla2 = bla
    .stream()
    .filter(s -> s.equals("something"))
    .findAny()
    .get();

System.out.println(bla2);

示例

import java.util.stream.*;
import java.util.*;

public class HelloWorld {
    public static void main(String[] args) {
        List < String > bla = new ArrayList();
        bla.add("one");
        bla.add("something");
        bla.add("two");

        String bla2 = bla
            .stream()
            .filter(s -> s.equals("something"))
            .findAny()
            .get();

        System.out.println(bla2);
    }
}

输出

something

【讨论】:

  • findAny()。此外,为了与相关代码保持一致,请将 get() 调用移至方法链。
【解决方案2】:

您可以使用返回Optional 对象的findFirst,然后然后使用Optional.orElseGet 设置您的默认值

Optional<String> optString = bla.stream()
         .filter(s->s.equals("something")).findFirst();

String somethingValue = optString.orElseGet(() -> "DEFAULT_VALUE");

另外,我强烈建议,不要直接调用get()方法,因为它会抛出NoSuchElementException,查看here了解详情,但你可以使用orElseGet如上图.

【讨论】:

  • 为什么要浪费时间/资源收集到列表,只是为了重新播放它?只需在filter() 之后立即致电findFirst()
  • 谢谢,我明白你的意思,完全正确,无需重新流式传输,更新我的答案。
【解决方案3】:

而不是使用

bla.stream() .filter(s->s.equals("something")) .collect(Collectors.toList()) .get(0);

你可以使用下面的

bla .stream() .filter(s->s.equals("something")) .collect(Collectors.toList());

get(0) 不是必需的

【讨论】:

  • 如果你只想找到第一个记录,你可以使用@javaguy方法
猜你喜欢
  • 2015-07-22
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
相关资源
最近更新 更多