如何编写读取 CSV 文件中两个不同列的 lambda 表达式?

How can I write a lambda expression that reads two different columns in a CSV file?

对于这个特定问题,“countRespondentsByAgeRange”接收字符串流(CSV 文件)和 returns 一张地图,其中包含按年龄范围(“18- 29”、“30-44”、“45-60”或“> 60”)。

在这个 CSV 文件中,前两行是 headers 列(因此它们基本上无关紧要)但是如果他们看过电影(“是”或“否”) ) 在第 2 列中,但包含年龄范围的列是第 31 列。

我需要知道如何将流过滤到如果受访者回答“是”的位置,它将采用他们的年龄范围和 return 所有他们的输出。

我只知道如何将一列复制到列表中并在那里查看,但由于您不能重复使用流,所以我不知道如何获取两者的信息。 我的尝试 return 是所有年龄段的地图以及其中有多少人,但我不知道如何过滤它以仅显示“是”的人 我的尝试:

public static final Function<Stream<String>, Map<String, Long>> countRespondentsWhoHaveWatchedAnyOfTheSixMoviesByAgeRange = a -> {
    // list of the age ranges from participants
    List<String> strToList = a.map(s -> s.split(",")[30]).collect(Collectors.toList());
    List<String> x = strToList.stream().filter(s -> s.startsWith("1")).collect(Collectors.toList());
    List<String> y = strToList.stream().filter(s -> s.startsWith("3")).collect(Collectors.toList());
    List<String> z = strToList.stream().filter(s -> s.startsWith("4")).collect(Collectors.toList());
    List<String> old = strToList.stream().filter(s -> s.startsWith(">")).collect(Collectors.toList());
    Long xVal = (long) x.size();
    Long yVal = (long) y.size();
    Long zVal = (long) z.size();
    Long oVal = (long) old.size();
    return Map.of("18-29", xVal, "30-44", yVal, "45-60", zVal, "> 60", oVal);
};

有谁知道如何将这个 lambda 表达式做一个更短的版本,通过它 filter/sort 到 return 这种映射?

在您的函数中,数据集迭代发生 五次,并且正在内存中分配一个中间列表。这是多余的。

如果不应用此多行函数,数据将直接在源流。

        Map<String, Long> ageByCount = getRespondentsData() // source of the stream
                .map(s -> s.split(","))                        // changing to Stream<String[]>
                .filter(arr -> arr[1].startsWith("Y"))         // filtering the results with answer "Yes"
                .collect(Collectors.groupingBy(arr -> arr[30], // grouping results by age
                                               Collectors.counting()));