You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:39:00