如何直接从流中收集值 - >过滤列表?

时间:2017-03-21 08:26:54

标签: java filter java-8 java-stream

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

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

像getOrDefault这样的东西会很棒。

3 个答案:

答案 0 :(得分:2)

您可以使用.findFirst()

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

然后,您只需拨打此Optional课程的Optional即可获取您的对象。

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

答案 1 :(得分:2)

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

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

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

此外,我强烈建议,不要直接调用get() 方法,因为它会抛出NoSuchElementException,查看get()了解详细信息,但您可以使用orElseGet,如上所示。

答案 2 :(得分:-1)

而不是使用

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

您可以使用以下

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

get(0)不是必需的