Java 8 过滤器包含



我是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
[]

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

提前感谢!

您需要使用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()));

>Stream.of(cityList)创建一个具有单个元素的Stream<List<String>>- 您的输入List

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

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

输出

[Noida, Gurgaon, Utah]

编码传递编译的唯一原因是ListString都有一个返回booleancontains方法。

最新更新