用于包含的 Java 8 过滤器

Ash*_*ish 4 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()));
Run Code Online (Sandbox Code Playgroud)

这是输出

Noida contains letter a
Gurgaon contains letter a
Utah contains letter a
[]
Run Code Online (Sandbox Code Playgroud)

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

提前致谢 !

Ous*_* D. 6

您需要使用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()));
Run Code Online (Sandbox Code Playgroud)


Era*_*ran 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()));
Run Code Online (Sandbox Code Playgroud)

输出

[Noida, Gurgaon, Utah]
Run Code Online (Sandbox Code Playgroud)

您的代码通过编译的唯一原因是 和List都有String一个contains返回boolean.