讲师中心 微信公众号
AI工具推荐 视频效率加速

Java Stream:合并从多个 CSV 文件读取的结果

阿杰酱_5980

阿杰酱_5980

发布时间:2025-10-25 13:15:00

|

199人浏览过

|

来源于php中文网

原创

java stream:合并从多个 csv 文件读取的结果

本文介绍如何使用 Java Stream 将从多个 CSV 文件读取的数据进行合并,并保持与第一个数据集相同的顺序。核心思路是利用 `forEach` 方法遍历第一个数据集(例如城市列表),然后在 Stream 中查找与第二个数据集(例如国家列表)匹配的记录,并将匹配到的信息添加到第一个数据集的相应对象中。

在实际应用中,我们经常需要从多个数据源(例如 CSV 文件)读取数据,并将这些数据进行关联和合并。如果需要保持特定数据集的顺序,同时又希望利用 Java Stream 的强大功能,就需要一种高效且可靠的方法。以下将详细介绍如何实现这一目标。

数据模型

首先,定义两个实体类 City 和 Country,分别对应城市和国家的数据结构。这两个类都使用 CsvBindByPosition 注解,用于将 CSV 文件中的列绑定到类的属性上。

import com.opencsv.bean.CsvBindByPosition;

public class City {

    @CsvBindByPosition(position = 0)
    private Integer id;

    @CsvBindByPosition(position = 1)
    private String name;

    @CsvBindByPosition(position = 2)
    private String countryCode;

    private String countryName; // 用于存储国家名称

    // getters and setters
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCountryCode() {
        return countryCode;
    }

    public void setCountryCode(String countryCode) {
        this.countryCode = countryCode;
    }

    public String getCountryName() {
        return countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }
}
import com.opencsv.bean.CsvBindByPosition;

public class Country {

    @CsvBindByPosition(position = 0)
    private Integer id;

    @CsvBindByPosition(position = 1)
    private String name;

    @CsvBindByPosition(position = 2)
    private String code;

    // getters and setters
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

注意,我们在 City 类中添加了一个 countryName 属性,用于存储从 Country 数据集中匹配到的国家名称。

Csv Brain
Csv Brain

加载CSV文件,使用自然语言(英文)提问。通过Anthropic、OpenAI或本地Ollama实现AI驱动的自然语言查询,无需SQL。

下载

立即学习“Java免费学习笔记(深入)”;

数据合并

以下代码演示了如何使用 Java Stream 将城市和国家数据进行合并,并保持城市数据的原始顺序:

import java.util.List;

public class DataMerger {

    public static void mergeCityAndCountry(List<City> cities, List<Country> countries) {
        cities.forEach(city -> city.setCountryName(countries.stream()
                .filter(country -> country.getCode().equals(city.getCountryCode()))
                .map(Country::getName)
                .findAny()
                .orElse(null)));
    }

    public static void main(String[] args) {
        // 模拟从 CSV 文件读取数据
        List<City> cities = List.of(
                new City() {{ setId(1); setName("Berlin"); setCountryCode("DE"); }},
                new City() {{ setId(5); setName("Kopenhag"); setCountryCode("DK"); }},
                new City() {{ setId(4); setName("Paris"); setCountryCode("FR"); }}
        );

        List<Country> countries = List.of(
                new Country() {{ setId(100); setName("Germany"); setCode("DE"); }},
                new Country() {{ setId(105); setName("France"); setCode("FR"); }},
                new Country() {{ setId(108); setName("Denmark"); setCode("DK"); }}
        );

        mergeCityAndCountry(cities, countries);

        // 打印合并后的结果
        cities.forEach(city -> System.out.println(city.getName() + " - " + city.getCountryName()));
    }
}

代码解释:

  1. cities.forEach(city -> ...):使用 forEach 循环遍历城市列表,保证了城市数据的原始顺序。
  2. countries.stream():为每个城市创建一个国家列表的 Stream。
  3. .filter(country -> country.getCode().equals(city.getCountryCode())):过滤国家列表,只保留国家代码与城市代码匹配的国家。
  4. .map(Country::getName):将匹配到的国家对象映射为国家名称。
  5. .findAny():查找任意一个匹配的国家名称。如果存在多个匹配项,只会返回其中一个。
  6. .orElse(null):如果找不到匹配的国家,则返回 null。
  7. city.setCountryName(...):将匹配到的国家名称设置到城市对象的 countryName 属性中。

注意事项

  • 数据量: 如果 countries 列表非常大,频繁地创建 Stream 可能会影响性能。可以考虑将 countries 列表转换为 Map,其中 key 为国家代码,value 为国家名称,从而提高查找效率。
  • 异常处理: 在实际应用中,需要考虑 CSV 文件读取异常、数据格式错误等情况,并进行适当的异常处理。
  • 线程安全: 如果需要在多线程环境下使用此代码,需要确保 cities 和 countries 列表是线程安全的。

总结

通过使用 Java Stream 的 forEach 方法和 filter 方法,我们可以方便地将从多个 CSV 文件读取的数据进行合并,并保持特定数据集的原始顺序。这种方法简洁、高效,并且易于理解和维护。在实际应用中,可以根据具体情况进行适当的优化和改进。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7139

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

818

2025.12.04

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2781

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

396

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

492

2026.05.09

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn