包含Java 8过滤器

时间:2017-09-06 12:09:26

标签: java lambda java-8 java-stream

我是Java 8的新手,当我试图为包含一个字母的所有城市设置过滤器时。它对我不起作用。但是,当我用旧方法运行时,它可以工作。

    List<String> cityList = new ArrayList<>();
    cityList.add("Noida");
    cityList.add("Gurgaon");
    cityList.add("Denver");
    cityList.add("London");
    cityList.add("Utah");
    cityList.add("New Delhi");

    System.out.println(cityList);

/* Prior to Java 8 Approach */      
    for (String city : cityList) {
            if(city.contains("a")){
                System.out.println(city + " contains letter a");
            }
        }
/* Java 8 Approach */           
    System.out.println(Stream.of(cityList).filter(str -> str.contains("a")).collect(Collectors.toList()));

这是输出

Noida contains letter a
Gurgaon contains letter a
Utah contains letter a
[]

请你解释一下我在哪里犯错误。

提前致谢!

2 个答案:

答案 0 :(得分:3)

您需要使用cityList.stream()而不是Stream.of(cityList)。目前的原因是,Stream.of(cityList)会返回Stream<List<String>>,而您需要Stream<String>。您仍然可以使用当前的方法完成任务,但是您需要将Stream<List<String>>展平为Stream<String>(我不建议,因为它会导致不必要的开销,因此它会最好使用cityList.stream())。

那就是说,你应该如何完成任务:

System.out.println(cityList.stream().filter(str -> str.contains("a")).collect(Collectors.toList()));

答案 1 :(得分:2)

Stream.of(cityList)创建一个Stream<List<String>>,其中包含一个元素 - 您的输入List

您需要使用cityList.stream()才能获得输入Stream<String>元素的List

System.out.println(cityList.stream().filter(str -> str.contains("a")).collect(Collectors.toList()));

输出

[Noida, Gurgaon, Utah]

您通过编译进行编码的唯一原因是ListString都有contains方法返回boolean

相关问题