java8 使用stream实现两个list集合合并成一个list集合及List切成多个list

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;


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("age",1000);
        list2.add(data);

        data=new HashMap<>();
        data.put("userId","100003");
        data.put("gender","雄");
        data.put("age",600);
        list2.add(data);

        data=new HashMap<>();
        data.put("userId","100004");
        data.put("gender","男");
        data.put("age",800);
        list2.add(data);

		//使用stream流把list1和list2根据属性userId合并一个list集合
        List<Map<String, Object>> list = list1.stream().map(m -> {
            list2.stream().filter(m2-> Objects.equals(m.get("userId"),m2.get("userId"))).forEach(m2-> {
                m.put("gender",m2.get("gender"));
                m.put("age",m2.get("age"));
            });
            return m;
        }).collect(Collectors.toList());

        for(Map<String, Object> map:list){
            System.out.println(map.toString());
        }
        return list;
    }
}


java8 合并两个 list<T>

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

list1中对象的属性:ticketId、ticketName
list2中对象的属性:ticketId、saleNum、batchAvailableNum
最总集合中对象的属性:ticketId、ticketName、saleNum、batchAvailableNum

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

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

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

        data=new Ticket();
        data.setTicketId("100002");
        data.setTicketName("八戒");
        list1.add(data);

        data=new Ticket();
        data.setTicketId("100003");
        data.setTicketName("悟空");
        list1.add(data);

        data=new Ticket();
        data.setTicketId("100004");
        data.setTicketName("沙僧");
        list1.add(data);

		//构建List集合2
        List<Ticket> list2 = new ArrayList<>();
        data=new Ticket();
        data.setTicketId("100001");
        data.setSaleNum("20");
        data.setBatchAvailableNum("10");
        list2.add(data);

        data=new Ticket();
        data.setTicketId("100001");
        data.setSaleNum("20");
        data.setBatchAvailableNum("10");
        list2.add(data);

        data=new Ticket();
        data.setTicketId("100002");
        data.setSaleNum("1000");
        data.setBatchAvailableNum("600");
        list2.add(data);

        data=new Ticket();
        data.setTicketId("100003");
        data.setSaleNum("600");
        data.setBatchAvailableNum("100");
        list2.add(data);

        data=new Ticket();
        data.setTicketId("100004");
        data.setSaleNum("800");
        data.setBatchAvailableNum("300");
        list2.add(data);
        
 		//使用stream流把list1和list2根据属性ticketId合并一个list集合
        List<Ticket> list = list1.stream().map(m -> {
            list2.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> {
                m.setSaleNum(m2.getSaleNum());
                m.setBatchAvailableNum(m2.getBatchAvailableNum());
            });
            return m;
        }).collect(Collectors.toList());

        for(Ticket ticket:list){
            System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());
        }
        return list;
    }
}


一个list 集合合并去重求和

使用stream实现list中对象属性的合并(去重并求和)

说明:
需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为Student,有id、nums、sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份。
例如说:(“s1”, 1, 1),(“s1”,2,3),(“s2”,3,5), 求和并去重的话,就是(“s1”, 3, 4),(“s2”,3,5)

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

    private String id;
    private int nums;
    private int sums;

    public String getId() {
        return id;
    }

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

    public int getNums() {
        return nums;
    }

    public void setNums(int nums) {
        this.nums = nums;
    }

    public int getSums() {
        return sums;
    }

    public void setSums(int sums) {
        this.sums = sums;
    }
}


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

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

    public static void main(String[] args) {

        List<Student> list = new ArrayList<>();

        Student s1 = new Student();
        s1.setId("s1");
        s1.setNums(1);
        s1.setSums(1);
        list.add(s1);

        s1 = new Student();
        s1.setId("s1");
        s1.setNums(2);
        s1.setSums(3);
        list.add(s1);

        s1 = new Student();
        s1.setId("s2");
        s1.setNums(3);
        s1.setSums(5);
        list.add(s1);

        //合并去重求和
        List<Student> result = merge(list);
        result.stream().forEach(e->{
            System.out.println("id:"+e.getId()+",nums:"+e.getNums()+",sums:"+e.getSums());
        });

    }

    /**
     * 将id进行合并nums, sums 相加道回合并后的集合使用Java8的流进行处理
     * @return
     */
    public static List<Student> merge(List<Student> list){

        List<Student> result = list.stream()
                .collect(Collectors.toMap(Student::getId, a->a,(o1,o2)->{
                    o1.setNums(o1.getNums()+o2.getNums());
                    o1.setSums(o1.getSums()+o2.getSums());
                    return o1;
                })).values().stream().collect(Collectors.toList());
        return result;
    }
}


拆分大list

在生产中经常会遇到大批量数据操作,如果直接大批量的数据对数据直接操作,则可能造成数据库执行时间过长,造成数据库压力过大。这里采用大批量数据分割成一块块小的数据,再对数据操作的方式来解决这种问题,也是我们常见的一种方式。



public class ListDateSpit {

    private List<String> listData = new ArrayList<>();


    @Before
    public void testInitData() {
        for (int i = 0; i < 1000; i++) {
            listData.add(String.format("数据ID-%s", i + 1));
        }
    }


    @Test
    public void testForeach() {
        for (String str : listData) {
            System.out.println("输出数据:" + str);
        }
    }

    @Test
    public void testSpitList() {

        List<List<String>> lisize = spitList(listData, 201);

        for (List<String> listList : lisize) {

            System.out.println(String.format("listlist:%s", listList.size()));
            for(String stt:listList){
                System.out.println(String.format("拆解后数据:%s", stt));
            }
            System.err.println("==============================================");

        }
    }


    public static List<List<String>> spitList(List<String> list, int pageSize) {

        List<List<String>> lists = new ArrayList<>();

        int countSize = list.size();

        int subSize = (countSize % pageSize > 0) ? (countSize / pageSize) + 1 : (countSize / pageSize);

        int currentSize = 0;
        for (int i = 0; i < subSize; i++) {
            System.out.println(String.format("subSize%s,i:%s", subSize, i));
            if (subSize == (i + 1)) {
                System.out.println(String.format("currentSize:%s,countSize:%s", currentSize, countSize));
                List<String> newList = list.subList(currentSize, countSize);
                lists.add(newList);
            } else {
                System.out.println(String.format("currentSize:%s,countSize:%s", currentSize, pageSize));
                List<String> newList = list.subList(currentSize, currentSize + pageSize);
                lists.add(newList);
            }
            currentSize += pageSize;
        }
        return lists;
    }

    @Test
    public void testDistinctList(){
        System.out.println(String.format("增加重复数据前listData size:%s",listData.size()));
        listData.addAll(createData());
        System.out.println(String.format("增加重复数据之后listData size:%s",listData.size()));

        List<String> testData=distinctList(listData);

        for (String tts:testData) {
            System.out.println(String.format("去重复后Data:"+tts));
        }
    }

 
    public List<String> createData(){
        List<String> newList=new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            newList.add(String.format("数据ID-%s", i + 1));
        }
        return newList;
    }

 
    public static List<String> distinctList(List<String> list){
        return list.stream().distinct().collect(Collectors.toList());
    }


    @Test
    public void testItemVOdistinct(){
        List<ItemVO> list=createItemData();

        for (ItemVO it:list){
            System.out.println(String.format("编号:%s,货品名称:%s",it.itemCode,it.itemName));
        }
    }


    public static List<ItemVO> createItemData(){
        List<ItemVO> itemList=new ArrayList<>();
        for(int i=0;i<1000;i++){
            itemList.add(new ItemVO(i,String.format("货品名称%s编号",i)));
        }
        return itemList;
    }

}


  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值