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

news2024/9/29 9:36:53

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.coloradmin.cn/o/2176332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的深度学习笔记

传统观念认为&#xff1a;在不考虑算力的情况下&#xff0c;网络越深&#xff0c;其准确率就越高&#xff0c;最直接的方法就是把网络设计的越深越好。 事实上&#xff1a;随着网络的层数不断加深&#xff0c;当达到一定的书目之后&#xff0c;训练精度和测试精度都有下降&…

第十三届蓝桥杯真题Java c组C.纸张尺寸(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;蓝桥杯关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 【问题描述】 在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm 841mm&#…

AI运用在营销领域的经典案例及解析

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 在前面一篇文章当中&#xff0c;我给大家介…

[Redis][典型运用][缓存]详细讲解

目录 0.什么是缓存&#xff1f;1.使用Redis作为缓存1.为什么用&#xff1f;2.如何用&#xff1f; 2.缓存的更新策略0.前言1.定期生成2.实时生成 3.缓存相关问题1.缓存预热(Cache Preheating)2.缓存穿透(Cache Penetration)3.缓存雪崩(Cache Avalanche)4.缓存击穿(Cache Breakdo…

一种多版本、多人并行开发GIT分支管理规范

首发公众号&#xff1a; 赵侠客 引言 作为开发者每天在写代码的同时也在写BUG&#xff0c;所以一方面需要开发新的需求&#xff0c;另一方面还要填自己以前挖的坑。目前主流程序员都在使用GIT来管理自己的代码&#xff0c;当GIT仓库有多人维护或者项目有多个版本同时迭代开发时…

c++进阶学习--------多态

前言 需要声明的&#xff0c;本节课件中的代码及解释都是在vs2022下的x86程序中&#xff0c;涉及的指针都是4bytes。 如果要其他平台下&#xff0c;部分代码需要改动。 比如&#xff1a;如果是x64程序&#xff0c;则需要考虑指针是8bytes问题等等 1. 多态的概念 1.1 概念 …

.NET内网实战:白名单文件反序列化执行命令

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏&#xff0c;主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧&#xff0c;对内网和后渗透感兴趣的朋友们可以订阅该电子报刊&#xff0c;解锁更多的报刊内容。 02基本介绍 本文内容部分节选自小报童…

【易社保-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Java泛型方法的定义和使用、泛型类、泛型接口、泛型方法、通配符、泛型的上界与下界

文章目录 一、包装类1.1、基本数据类型和对应的包装类1.2、自动装箱和自动拆箱 二、基本介绍2.1、泛型引入背景2.1、什么是泛型2.2、为什么使用泛型 三、常见泛型字母含义四、泛型的使用4.1、泛型类4.2、泛型接口4.3、泛型方法 五、泛型的继承5.1、泛型不具备继承性5.2、何为数…

【Python】递归

专栏文章索引&#xff1a;Python 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 文章内容改自&#xff1a;bilibili博主(又懂啦) 目录 一、递归函数 二、理解递归函数 一、递归函数 一个函数在其函数体内调用函数自身&#xff0c;这样的函数就称为递归函数。递归函数的…

每日一练 2024.9.29(2)

目录 解题思路与代码实现 题目分析 一、解题策略 关键步骤&#xff1a; 二、代码实现 三、代码解析 四、复杂度分析 五、运行示例 示例1&#xff1a; 示例2&#xff1a; 六、总结 解题思路与代码实现 题目分析 这道题目要求我们找到字符串列表 strs 中的相似字符组…

Arch - 架构安全性_验证(Verification)

文章目录 OverView导图1. 引言&#xff1a;数据验证的重要性概述2. 数据验证的基本概念3. 数据验证的层次前端验证后端验证 4. 数据验证的标准做法5. 自定义校验注解6. 校验结果的处理7. 性能考虑与副作用8. 小结 OverView 即使只限定在“软件架构设计”这个语境下&#xff0c…

物理学基础精解【40】

文章目录 矢量积矢量积&#xff08;又称叉积、外积&#xff09;的几何意义一、面积表示二、垂直性三、方向性四、应用实例五、数学表达 矢量积&#xff08;叉积&#xff09;的坐标表示法矢量积的坐标表示法的几何意义矢量积的性质矢量积的应用 矢量积&#xff08;又称叉积、外积…

Linux——k8s组件

kubernetes 使用1.31.1 版本搭建集群核心组件&#xff0c;选择flannel 网络插件为整体集群的运行提供网络通信功能。 flannel 网络插件 kube-flannel kube-flannel-ds-9fgml 1/1 Running 1 (18m ago) 2d21h kube-flannel kube-flannel-ds-ghwbq …

<<迷雾>> 第 3 章 怎样才能让机器做加法 示例电路

全加器示意图 info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch03-01-full-adder.txt 原图 由3个全加器组成的3比特加法机 info::操作说明…

Linux——pod的调度

pod的调度 控制器: rc/rs 副本数量控制器 主要保证pod的数量符合管理员要求&#xff0c;并不会对pod进行额外的管理 以下三种控制器&#xff0c;本质上是服务控制器。具备以下特性&#xff1a; 副本数量的控制服务的滚动更新&#xff08;更新pod&#xff09;支持更新失…

基于springboot vue 投票系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

基于51单片机的2路电压采集proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1oNOJJv78ecfWZkdlMyhNVQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

Linux:LCD驱动开发

目录 1.不同接口的LCD硬件操作原理 应用工程师眼中看到的LCD 1.1像素的颜色怎么表示 ​编辑 1.2怎么把颜色发给LCD 驱动工程师眼中看到的LCD 统一的LCD硬件模型 8080接口 TFTRGB接口 什么是MIPI Framebuffer驱动程序框架 怎么编写Framebuffer驱动框架 硬件LCD时序分析…

OpenAI全新多模态内容审核模型上线:基于 GPT-4o,可检测文本和图像

在数字时代&#xff0c;内容安全问题愈发受到重视。9月26日&#xff0c;OpenAI 正式推出了一款全新的多模态内容审核模型&#xff0c;名为 “omni-moderation-latest”。 该模型基于最新的 GPT-4o 技术&#xff0c;能够准确地识别检测有害文本图像。这一更新将为开发者提供强大…