java jdk8 使用stream实现两个list集合合并成一个list集合(对象属性的合并)

本文详细介绍了如何使用Java 8的Stream API合并两个List,包括List<Map>和List<T>的合并,以及在不同场景下的处理,如集合个数不等的情况,并提供了一个去重求和的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java使用stream实现list中对象属性的合并:
根据两个List中的某个相同字段合并成一条List,包含两个List中的字段

目录

一、前言

为什么要用Lambda表达式Stream流做集合的处理? 因为效率高、代码简洁、高端大气上档次!

(1)描述:比如一个List集合中List<对象1>,该对象1包含A、B和C列;另外一个List集合中List<对象2>,该对象2包含A、D列;

(2)问题:需要将两个List合成List<对象3>返回,该对象3包含A、B、C、D列

(3)实现:使用stream实现两个list集合合并成一个list集合

简要说明:filter的使用方式为: filter(item -> item的逻辑判断 ) ,其中filter会保留判断条件为true的记录

二、示例

示例1:java8 合并两个 list<map>

java8 合并两个 list<map>, 并将userId 相同的所有属性合并到一个map中

list1中对象的属性:userId、userName
list2中对象的属性:userId、gender、age
最总集合中对象的属性:userId、userName、gender、age

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author qzz
 */
public class ListTest {

    public static void main(String[] args) {
        mergeList();
    }
    /**
     * @Description: 合并两个list<map>,并将userId相同的其它属性合并
     * @Title: mergeList
     * @param: @return
     * @return: List<Map<String,Object>>
     * @throws
     */
    public static List<Map<String,Object>> mergeList(){
        //构建List集合1
        List<Map<String,Object>> list1 = new ArrayList<>();
        Map<String,Object> data=new HashMap<>();
        data.put("userId","100001");
        data.put("userName","唐僧");
        list1.add(data);

        data=new HashMap<>();
        data.put("userId","100002");
        data.put("userName","八戒");
        list1.add(data);

        data=new HashMap<>();
        data.put("userId","100003");
        data.put("userName","悟空");
        list1.add(data);

        data=new HashMap<>();
        data.put("userId","100004");
        data.put("userName","沙僧");
        list1.add(data);

 		//构建List集合2
        List<Map<String,Object>> list2 = new ArrayList<>();
        data=new HashMap<>();
        data.put("userId","100001");
        data.put("gender","男");
        data.put("age",20);
        list2.add(data);

        data=new HashMap<>();
        data.put("userId","100002");
        data.put("gender","雄");
        data.put(
JDK8中,引入了Stream API,这个API提供了一种更加简洁,高效的方式来处理数据的流式操作,Stream API支持对数据流进行过滤、映射、排序、聚合等多种操作。对于双重循环的情况,JDK8Stream提供了三种方式:flatMap、forEach和reduce。 1. flatMap:flatMap操作可以将一个Stream中的每个元素转换一个Stream,然后将所有Stream合并一个。在处理双重循环的情况下,我们可以使用flatMap将两个Stream合并一个,然后对结果进行处理。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); List<int[]> result = list1.stream() .flatMap(i -> list2.stream() .map(j -> new int[]{i, j})) .collect(Collectors.toList()); result.forEach(arr -> System.out.println(Arrays.toString(arr))); ``` 2. forEach:forEach操作可以对Stream中的每个元素执行指定的操作。我们可以在forEach中嵌套一层循环来处理双重循环的情况。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); list1.forEach(i -> { list2.forEach(j -> { int[] arr = new int[]{i, j}; System.out.println(Arrays.toString(arr)); }); }); ``` 3. reduce:reduce操作可以将Stream中的元素通过指定的操作进行合并,返回一个Optional类型的结果。我们可以在reduce中嵌套一层循环来处理双重循环的情况。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); List<int[]> result = list1.stream() .reduce(new ArrayList<>(), (acc, i) -> { list2.forEach(j -> acc.add(new int[]{i, j})); return acc; }, (l1, l2) -> {l1.addAll(l2); return l1;}); result.forEach(arr -> System.out.println(Arrays.toString(arr))); ``` 总之,在JDK8中处理双重循环可以使用flatMap、forEach和reduce等操作来实现,这些操作让Java代码变得更加简洁、高效、易于理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值