如何用Java函数式编程提取列数据并生成Map<Date, List<Integer>>
Java流式处理实现数据集列提取与结构转换
前置假设
你的covidListWithoutCountryDetails数据集结构符合以下规则:
- 第1个(索引为0)子列表存储所有日期字符串,格式为
yyyy/M/d - 从第2个(索引≥1)子列表开始,每一个子列表对应一个地区的每日病例数,与第一行的日期一一对应
完整实现代码
import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; public class CovidDataHandler { public static void main(String[] args) { // 你的原始数据集 List<List<String>> covidListWithoutCountryDetails = ...; // 定义日期解析格式 DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/M/d"); // 流式处理完成列提取与结构转换 Map<Date, List<Integer>> dateCaseMap = IntStream.range(0, covidListWithoutCountryDetails.get(0).size()) // 按列索引遍历,每一个索引对应一列数据 .boxed() .collect(Collectors.toMap( // 列对应的日期作为key colIndex -> Date.from( LocalDate.parse(covidListWithoutCountryDetails.get(0).get(colIndex), dateFormatter) .atStartOfDay(ZoneId.systemDefault()) .toInstant() ), // 提取当前列所有数值转为Integer集合作为value colIndex -> IntStream.range(1, covidListWithoutCountryDetails.size()) .mapToObj(rowIndex -> { // 可根据需求调整异常处理逻辑 try { return Integer.parseInt(covidListWithoutCountryDetails.get(rowIndex).get(colIndex).trim()); } catch (NumberFormatException e) { return 0; } }) .collect(Collectors.toList()) )); // 打印验证输出,符合你的预期格式 dateCaseMap.forEach((k, v) -> System.out.println("{" + k + "=" + v + "}")); } }
逻辑说明
列提取实现
List<List<String>>属于行式存储结构,要提取每一列数据,我们通过IntStream.range遍历所有列索引,再依次读取每一行对应索引位置的元素,即可拿到单列的完整数据,全程采用流式API实现,符合Java函数式编程规范。
结构转换实现
使用Collectors.toMap收集器,直接将每一列的日期转为Date类型作为key,当前列的所有数值转为Integer集合作为value,一步生成你需要的Map<Date, List<Integer>>结构。
原代码错误原因
你的原有代码是按行遍历数据集,重复插入第一行第一列的固定key,还引用了未定义的zeroIndexList变量,既没有按列提取数据,也没有生成对应日期的数值列表,逻辑完全偏离需求。
内容的提问来源于stack exchange,提问作者mike kong
相关产品推荐
相关产品推荐

