有人可以解释一下为什么我不能通过.stream()。filter过滤List中的字符串吗?我收到的只是未过滤的字符串! 我会感激的。
public static void main(String[] args) throws FileNotFoundException {
List<Country> countries = CsvToBeanConverterCountry("country.csv");
countries
.stream().filter(s -> s.getName().contains("xx")).collect(Collectors.toList());
countries.forEach(s -> System.out.println(s.getName()));
}
private static List CsvToBeanConverterCountry(String csvFilename) throws FileNotFoundException {
CsvToBean csv = new CsvToBean();
CSVReader csvReader = new CSVReader(new FileReader(csvFilename), ';', '"', 1);
List list = csv.parse(setColumMappingCountry(), csvReader);
return list;
}
private static ColumnPositionMappingStrategy setColumMappingCountry() {
ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
strategy.setType(Country.class);
String[] columns = new String[]{"country_id", "city_id", "name"};
strategy.setColumnMapping(columns);
return strategy;
}
}
答案 0 :(得分:7)
您忽略了收集的结果:
*tmp*
因此,您应该将结果分配到一个新列表并仅打印该列表
countries.stream().filter(s -> s.getName().contains("xx"))
.collect(Collectors.toList());
答案 1 :(得分:3)
您应将结果分配给countries
:
countries = countries.stream().filter(s -> s.getName()
.contains("xx")).collect(Collectors.toList());
countries.forEach(s -> System.out.println(s.getName()));
countries.stream().filter(...)
不会内联过滤countries
列表,它运行流,结果将被忽略。
此外,您可以直接在流上运行forEach
,而无需先收集到列表中:
countries.stream().filter(s -> s.getName()
.contains("xx"))
.forEach(s -> System.out.println(s.getName()));
答案 2 :(得分:2)
您似乎打算修改原始列表,而不是生成包含某些元素的新列表。
在这种情况下,您可以简单地删除不需要的元素:
countries.removeIf(c -> !c.getName().contains("xx"));
这比创建流和新集合更有效,但是会更改列表。
答案 3 :(得分:1)
当然,发生的是:.stream()不会更改实际列表。
您可以做的是:
List<Country> countries = CsvToBeanConverterCountry("country.csv");
countries
.stream()
.filter(s -> s.getName().contains("xx"))
.forEach(s -> System.out.println(s.getName()));