Java中的数据合并与拆分:使用Stream API实现数据的灵活处理

Java中的数据合并与拆分:使用Stream API实现数据的灵活处理

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,数据处理是最基础的操作之一,而在面对大量数据时,合并与拆分数据是常见的需求。Java 8 引入了 Stream API,为数据的操作提供了简洁、灵活的方式。本文将介绍如何使用 Stream API 实现数据的合并与拆分操作,提升代码的可读性和处理效率。

一、什么是Stream API?

Stream API 是 Java 8 引入的一个强大的工具,旨在简化对集合数据的处理。它允许我们使用类似函数式编程的方式来处理数据,尤其适用于对集合对象进行过滤、转换、归约、合并等操作。

Stream API 支持惰性计算,可以在大量数据的情况下提升性能,同时它还支持并行处理,有助于提升处理速度。下面我们将通过实际的代码示例来展示如何使用 Stream API 实现数据合并与拆分。

二、使用 Stream API 合并数据

合并数据通常指的是将多个集合或数组的数据进行拼接、组合。Stream API 提供了 Stream.concat()flatMap() 等方法,来处理数据的合并操作。接下来我们将通过具体示例来演示如何使用这些方法合并数据。

package cn.juwatech.stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class DataMergeExample {

    public static void main(String[] args) {
        // 定义两个集合
        List<String> list1 = Arrays.asList("A", "B", "C");
        List<String> list2 = Arrays.asList("D", "E", "F");

        // 使用 Stream.concat() 合并两个集合
        List<String> mergedList = Stream.concat(list1.stream(), list2.stream())
                                        .collect(Collectors.toList());

        System.out.println("合并后的数据: " + mergedList);

        // 合并嵌套列表
        List<List<String>> nestedList = Arrays.asList(list1, list2);
        List<String> flatList = nestedList.stream()
                                          .flatMap(List::stream) // 使用flatMap展开嵌套列表
                                          .collect(Collectors.toList());

        System.out.println("展开后的数据: " + flatList);
    }
}

在这个示例中,首先我们使用 Stream.concat() 合并了两个列表 list1list2,并将结果收集为一个新的列表。接着,我们使用 flatMap() 展开嵌套的 List<List<String>>,将其转换为一个平铺的列表。通过这种方式,数据的合并操作变得非常简洁明了。

三、使用 Stream API 拆分数据

拆分数据是指将一个集合按一定的条件进行分割。Stream API 提供了丰富的操作符,比如 filter()partitioningBy()groupingBy() 等,能够灵活地对数据进行拆分。我们来看几个具体的拆分操作示例。

  1. 根据条件拆分数据

使用 filter() 可以轻松地根据条件拆分集合。下面的示例演示如何拆分一个整数列表,将其分为奇数和偶数。

package cn.juwatech.stream;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class DataSplitExample {

    public static void main(String[] args) {
        // 定义一个整数列表
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 使用 partitioningBy 拆分为奇数和偶数
        Map<Boolean, List<Integer>> partitionedData = numbers.stream()
                                                             .collect(Collectors.partitioningBy(num -> num % 2 == 0));

        System.out.println("偶数: " + partitionedData.get(true));
        System.out.println("奇数: " + partitionedData.get(false));
    }
}

在这个示例中,我们使用 partitioningBy() 方法将 numbers 列表拆分为两部分:奇数和偶数。拆分后的结果被存储在一个 Map<Boolean, List<Integer>> 中,其中 true 对应偶数,false 对应奇数。

  1. 按组拆分数据

groupingBy() 方法允许我们根据指定的分组条件将数据分为多个组。下面的示例展示如何按年龄段将用户进行分组。

package cn.juwatech.stream;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    String name;
    int age;

    User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + "(" + age + ")";
    }
}

public class GroupingExample {

    public static void main(String[] args) {
        // 定义一个用户列表
        List<User> users = Arrays.asList(
                new User("Alice", 25),
                new User("Bob", 35),
                new User("Charlie", 45),
                new User("David", 25),
                new User("Edward", 35)
        );

        // 按年龄分组
        Map<Integer, List<User>> groupedByAge = users.stream()
                                                     .collect(Collectors.groupingBy(user -> user.age));

        groupedByAge.forEach((age, userList) -> {
            System.out.println("年龄 " + age + " 的用户: " + userList);
        });
    }
}

在这个示例中,我们使用 groupingBy() 方法将用户按年龄进行分组,并输出每个年龄段对应的用户列表。groupingBy() 是一个非常灵活的分组工具,适用于各种分组需求。

四、使用 Stream API 合并对象属性

有时候,我们需要合并多个对象的某些属性,这时 Stream API 也能派上用场。通过 map() 操作,我们可以轻松地提取对象的某个属性,并将其合并为一个新的数据集。下面是一个合并用户姓名的示例。

package cn.juwatech.stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class User {
    String name;
    int age;

    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class MergeUserNamesExample {

    public static void main(String[] args) {
        // 定义用户列表
        List<User> users = Arrays.asList(
                new User("Alice", 25),
                new User("Bob", 35),
                new User("Charlie", 45),
                new User("David", 25)
        );

        // 合并所有用户的名字
        String mergedNames = users.stream()
                                  .map(user -> user.name) // 提取名字
                                  .collect(Collectors.joining(", ")); // 合并为一个字符串

        System.out.println("合并的名字: " + mergedNames);
    }
}

在这个示例中,map() 方法用于提取每个用户的名字,Collectors.joining(", ") 则用于将所有名字合并为一个逗号分隔的字符串。通过这种方式,我们可以灵活地对对象的某些属性进行合并处理。

五、使用 Stream API 拆分复杂对象

在某些场景下,我们可能需要从一个复杂对象中提取某些部分,将其拆分为多个集合。Stream API 的 map()flatMap() 是处理这种需求的利器。下面的示例展示了如何从一个订单对象中提取商品列表,并将其合并为一个总的商品集合。

package cn.juwatech.stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class Product {
    String name;

    Product(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}

class Order {
    String orderId;
    List<Product> products;

    Order(String orderId, List<Product> products) {
        this.orderId = orderId;
        this.products = products;
    }
}

public class FlattenOrderProductsExample {

    public static void main(String[] args) {
        // 定义几个订单
        List<Order> orders = Arrays.asList(
                new Order("Order1", Arrays.asList(new Product("ProductA"), new Product("ProductB"))),
                new Order("Order2", Arrays.asList(new Product("ProductC"), new Product("ProductD"))),
                new Order("Order3", Arrays.asList(new Product("ProductE")))
        );

        // 提取并合并所有订单中的商品
        List<Product> allProducts = orders.stream()
                                          .flatMap(order -> order.products.stream()) // 展开每个订单中的商品列表
                                          .collect(Collectors.toList());

        System.out.println("所有商品: " + allProducts);
   

 }
}

在这个示例中,flatMap() 被用来展开每个订单中的商品列表,并将所有商品合并为一个总的商品集合。

六、总结

通过 Java Stream API,我们能够以简洁、高效的方式实现数据的合并与拆分操作。无论是简单的数据集合操作,还是复杂对象的属性合并,Stream API 都能够灵活应对,并提高代码的可读性和可维护性。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/885963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解调用钉钉AI助理消息API发送钉钉消息卡片给指定单聊用户

文章目录 前言准备工作1、在钉钉开发者后台创建一个钉钉企业内部应用&#xff1b;2、创建并保存好应用的appKey和appSecret&#xff0c;后面用于获取调用API的请求token&#xff1b;3、了解AI助理主动发送消息API&#xff1a;4、应用中配置好所需权限&#xff1a;4.1、权限点4.…

OkHttp 详细使用步骤,以及异步请求和同步请求

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

python编程开发“人机猜拳”游戏

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Arduino UNO R3自学笔记6 之 Arduino引脚(IO)功能介绍

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;Ardunio UNO R3有很多引脚&#xff0c;接下来主要介绍它们都可以用做什么。 从上图不难看出开发板引脚也不是有多少&#xff0c;分类来看也就以下种类型&…

翻译:Recent Event Camera Innovations: A Survey

摘要 基于事件的视觉受到人类视觉系统的启发&#xff0c;提供了变革性的功能&#xff0c;例如低延迟、高动态范围和降低功耗。本文对事件相机进行了全面的调查&#xff0c;并追溯了事件相机的发展历程。它介绍了事件相机的基本原理&#xff0c;将其与传统的帧相机进行了比较&am…

大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

最大正方形 Python题解

最大正方形 题目描述 在一个 n m n\times m nm 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形&#xff0c;输出边长。 输入格式 输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100)&#xff0c;接…

[Linux]开发环境搭建

RPM和YUM 安装JDK 安装Tomcat 安装IDEA 安装MySql

2-109 基于matlab-GUI的BP神经网络

基于matlab-GUI的BP神经网络&#xff0c;10种不同分布的数据样本&#xff0c;9种不同的激活函数&#xff0c;可更改升级网络结构参数&#xff0c;对比各种方法参数下的训练测试效果&#xff0c;实时显示预测过程。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&…

以Flask为基础的虾皮Shopee“曲线滑块验证码”识别系统部署

以Flask为基础的虾皮Shopee“曲线滑块验证码”识别系统部署 一、验证码类型二、简介三、Flask应用 一、验证码类型 验证码类型&#xff1a;此类验证码存在两个难点&#xff0c;一是有右侧有两个凹槽&#xff0c;二是滑块的运动轨迹不是直线的&#xff0c;而是沿着曲线走的&…

AI驱动TDSQL-C Serverless 数据库技术实战营-与AI的碰撞

目录 一、简介 二、实验介绍 三、结果展示 四、实操指导 4.1 系统设计 4.2 环境搭建&#xff08;手把手教程&#xff09; 4.3 应用构建 4.4 效果展示 4.5 踩坑避雷总结 五、清理资源 5.1 删除TDSQL-C Serverless 5.2 删除 HAI 算力 六、实验总结归纳 一、简介 本…

SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS

一、本地上传 概念&#xff1a;将前端上传的文件保存到自己的电脑 作用&#xff1a;前端上传的文件到后端&#xff0c;后端存储的是一个临时文件&#xff0c;方法执行完毕会消失&#xff0c;把临时文件存储到本地硬盘中。 1、导入文件上传的依赖 <dependency><grou…

用于高频交易预测的最优输出LSTM

用于高频交易预测的最优输出LSTM J.P.Morgan的python教程 Content 本文提出了一种改进的长短期记忆&#xff08;LSTM&#xff09;单元&#xff0c;称为最优输出LSTM&#xff08;OPTM-LSTM&#xff09;&#xff0c;用于实时选择最佳门或状态作为最终输出。这种单元采用浅层拓…

Elasticsearch:使用 LLM 实现传统搜索自动化

作者&#xff1a;来自 Elastic Han Xiang Choong 这篇简短的文章是关于将结构化数据上传到 Elastic 索引&#xff0c;然后将纯英语查询转换为查询 DSL 语句&#xff0c;以使用特定过滤器和范围搜索特定条件。完整代码位于此 Github repo 中。 首先&#xff0c;运行以下命令安装…

Apache POI 2024/10/2

导入Apache POI的maven坐标 通过POI向Excel文件写入文件内容 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.…

【C++并发入门】opencv摄像头帧率计算和多线程相机读取(下):完整代码实现

前言 高帧率摄像头往往应用在很多opencv项目中&#xff0c;今天就来通过简单计算摄像头帧率&#xff0c;抛出一个单线程读取摄像头会遇到的问题&#xff0c;同时提出一种解决方案&#xff0c;使用多线程对摄像头进行读取。上一期&#xff1a;【C并发入门】摄像头帧率计算和多线…

1.5 测试用例

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 测试用例介绍2 测试用例编写3 案例分析4 执行测试用例 前言 测试用例的设计和编制是软件活动中最重要的工作。本文详细讲解了测试用例的基本概念以及如何编写测试用例。 本篇文…

深入掌握 Protobuf 与 RPC 的高效结合:实现C++工程中的高效通信

目录 一、Protobuf与RPC框架的通信流程概述二、Protobuf与RPC在C中的实际应用2.1 定义 .proto 文件2.2 编译 .proto 文件生成C代码2.3 实现服务器端逻辑2.4 实现客户端逻辑2.5 使用CMake构建工程2.6 编译与运行2.7 关键组件解析2.8 序列化与反序列化的实现 三、关键实现与解析四…

Redis: Sentinel哨兵监控架构及环境搭建

概述 在主从模式下&#xff0c;我们通过从节点只读模式提高了系统的并发能力并发不断增加&#xff0c;只需要扩展从节点即可&#xff0c;只要主从服务器之间&#xff0c;网络连接正常主服务器就会将写入自己的数据同步更新给从服务器&#xff0c;从而保证主从服务器的数据相同…

网络安全 DVWA通关指南 DVWA Weak Session IDs(弱会话)

DVWA Weak Session IDs&#xff08;弱会话&#xff09; 文章目录 DVWA Weak Session IDs&#xff08;弱会话&#xff09;Low LevelMedium LevelHigh LevelImpossible Level 参考文献 WEB 安全靶场通关指南 相关阅读 Brute Force (爆破) Command Injection&#xff08;命令注入…