如何使用字符串过滤我的列表?

时间:2018-08-20 16:19:09

标签: java collections java-stream

有人可以解释一下为什么我不能通过.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;
    }
}

4 个答案:

答案 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()));