当前位置: 首页 > 知识库问答 >
问题:

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

姜嘉荣
2023-03-14

对于这个特定的问题,“CountRespondentsByAgerage”接收一个字符串流(CSV文件),并返回一个地图,其中包含按年龄段(即“18-29”、“30-44”、“45-60”或

在这个CSV文件中,前两行是列标题(因此它们基本上无关紧要),但如果他们看了电影或没有看电影,则保留的列(“是”或“否”)在第2列,但保留年龄范围的列是第31列。

我需要知道如何过滤掉流,如果回答者回答“是”,它将采取他们的年龄范围,并返回所有人的输出。

我只知道如何将一列复制到列表中并浏览那里,但是因为你不能重用一个流,我不知道如何获得两者的信息。我的尝试返回一张所有年龄范围的地图,以及里面有多少人,但我不知道如何过滤它,只显示“是”的人。我的尝试:

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表达式进行较短版本的筛选/排序以返回这种映射吗?

共有2个答案

颜思淼
2023-03-14

您可以一步一步地处理流,并使用收集器在最后收集到映射。按和收集器分组。计数()。比如:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

....


public static Map<String, Long> countRespondentsByAgeRange(String yourCsvFile)  {
    Map<String, Long> result = null;
    try (final Stream<String> lines = Files.lines(Path.of(yourCsvFile))) {
        result =  lines.map(line -> line.split(","))    //split at comma and map to array
                    .filter(arr -> arr[1].equals("Yes"))       // filter lines having only yes as value at index 1
                    .collect(Collectors.groupingBy(arr -> arr[30], Collectors.counting())); //group by index 30 and map to count
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}
锺离明煦
2023-03-14

在函数内部,对数据集的迭代发生了五次,中间列表正在内存中分配。这是多余的。

如果不应用此多行函数,而是直接在源流中处理数据,则您的解决方案可以在性能和可读性方面得到改进。

        Map<String, Long> ageByCount = getRespondentsData() // source of the stream
                .map(s -> s.split(","))
                .filter(arr -> arr[1].startsWith("Y"))
                .map(arr -> arr[30])
                .collect(Collectors.groupingBy(UnaryOperator.identity(),
                                               Collectors.counting()));
 类似资料:
  • 通过更改两个域模型的包,解决了我在前面的链接中发布的上述错误,Apache camel同时处理两个csv文件。 但是,它给出了另一个错误,并回滚了对两个.csv文件的处理。这两个.csv文件都有两个单独的处理器用于处理交换。 错误:[#2012-06-12T10:23:54.651+1000SevereGlassFish3.0.1org.apache.camel.processor.DefaulT

  • 我在Java 1.8中有以下代码。 如果没有lambda,如何将其转换为Java 1.7代码?

  • 问题内容: 我已经编写了一个AWS Lambda函数,其目的是在调用时- 它读取文件x.db的内容,从中获取特定值并返回给调用者。但是这个x.db文件会不时更改。因此,我想将此x.db文件上传到S3并从AWS Lambda函数读取它,就像读取文件一样。 如何从用Java编写的AWS Lambda Function中读取此类x.db S3文件? 问题答案: 使用Java S3 SDK。如果您将一个名

  • 问题内容: 我有一个列表列表,我想将其写入csv文件中。示例列表: data [0]应该是列名,其他都是行数据 请给我建议一种方法。 问题答案: 这与模块无关紧要: 您已经具有标题作为第一行;您可以使用该方法一次性写入所有行。真的,这就是全部。

  • 我在这里发现了以下文章:JSP文件中的Lambda表达式将无法编译 因此,我在Tomcat的conf/web.xml中添加了compilerSourceVM和compilerTargetVM。(不在web.xml项目中)。 有什么提示吗? 提前谢了。 编辑: b.)out变量必须是final。因此需要 c.)您可能必须将JSP API库导入到我们的项目中。Gradle示例:

  • 本文向大家介绍如何编写JSP表达式?,包括了如何编写JSP表达式?的使用技巧和注意事项,需要的朋友参考一下 JSP表达式元素包含一种脚本语言表达式,该脚本语言表达式经过评估,转换为String,并插入该表达式出现在JSP文件中的位置。 由于表达式的值已转换为字符串,因此可以在JSP文件的一行文本中使用表达式,无论是否用HTML标记。 expression元素可以包含根据Java语言规范有效的任何表