Java8的Lambda遍历两个List匹配数据方式

目录
  • Lambda遍历两个List匹配数据
    • 1.定义一个静态方法
    • 2.Main方法测试
    • 3.输出结果
  • jdk1.8的stream对两个List遍历匹配数据的处理

Lambda遍历两个List匹配数据

1. 定义一个静态方法

/**
     *  通过遍历两个List中按id属性相等的归结到resultList中
     * @param oneList
     * @param twoList
     */
    public static List<Map<Object, Object>> compareListHitData(List<Map<Object, Object>> oneList, List<Map<Object, Object>> twoList) {
        List<Map<Object, Object>> resultList = oneList.stream().map(map -> twoList.stream()
                .filter(m -> Objects.equals(m.get("id"), map.get("id")))
                .findFirst().map(m -> {
                    map.putAll(m);
                    return map;
                }).orElse(null))
                .filter(Objects::nonNull).collect(Collectors.toList());
        return resultList;
    }

2. Main方法测试

public static void main(String[] args) {
        List<Map<Object, Object>> oneList = new ArrayList<>();
        Map<Object, Object> oneMap = new HashMap<>();
        oneMap.put("id", 111);
        oneMap.put("userName", "何金荣");
        Map<Object, Object> twoMap = new HashMap<>();
        twoMap.put("id", 222);
        twoMap.put("userName", "Hejinrong");
        oneList.add(oneMap);
        oneList.add(twoMap);
        List<Map<Object, Object>> twoList = new ArrayList<>();
        Map<Object, Object> threeMap = new HashMap<>();
        threeMap.put("id", 111);
        threeMap.put("userName", "何金荣");
        Map<Object, Object> fourMap = new HashMap<>();
        fourMap.put("id", 333);
        fourMap.put("userName", "Hejinrong");
        twoList.add(threeMap);
        twoList.add(fourMap);
        List<Map<Object, Object>> resultList = compareListHitData(oneList, twoList);
        System.out.println(resultList);
    }

3. 输出结果

jdk1.8的stream对两个List遍历匹配数据的处理

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

public class testStream {
    public static void main(String[] args) {
        List<AwardInfo> prizeRecords = new ArrayList<AwardInfo>(6);
        List<StockInfo> stockDTOList = new ArrayList<StockInfo>();
        for (int i = 0; i < 6; i++) {
            AwardInfo AwardInfo = new AwardInfo();
            AwardInfo.setStockNo((i+1)+"");
            prizeRecords.add(AwardInfo);
        }
        for (int i = 0; i < 3; i++) {
            StockInfo stockDTO = new StockInfo();
            stockDTO.setStockNo((i+1)+"");
            stockDTO.setThirdStockNo("third"+(i+1));
            stockDTOList.add(stockDTO);
        }
        StockInfo stockDTO1 = new StockInfo();
        stockDTO1.setStockNo((44)+"");
        stockDTO1.setThirdStockNo("third"+44);
        stockDTOList.add(stockDTO1);

        StockInfo stockDTO2 = new StockInfo();
        stockDTO2.setStockNo((55)+"");
        stockDTO2.setThirdStockNo("third"+55);
        stockDTOList.add(stockDTO2);

        //prizeRecords与stockDTOList求差集
        List<AwardInfo> resultList1 = prizeRecords.stream()
                .map(map -> stockDTOList.stream()
                        .filter(m -> !Objects.equals(m.getStockNo(), map.getStockNo()))
                        .findFirst().map(m -> {
                            return map;
                        }).orElse(null))
                .filter(Objects::nonNull).collect(Collectors.toList());
        /**
         * 求差集:失败结果参考
         * [AwardInfo{userId='null', stockNo='1', thirdStockNo='null'},
         * AwardInfo{userId='null', stockNo='2', thirdStockNo='null'},
         * AwardInfo{userId='null', stockNo='3', thirdStockNo='null'},
         * AwardInfo{userId='null', stockNo='4', thirdStockNo='null'},
         * AwardInfo{userId='null', stockNo='5', thirdStockNo='null'},
         * AwardInfo{userId='null', stockNo='6', thirdStockNo='null'}]
         */
        System.out.println(resultList1.toString());

       /* List<AwardInfo> list2 = prizeRecords.stream()
                .filter(map -> stockDTOList.stream().anyMatch(map1 -> map.getStockNo().equals(map1.getStockNo())))
                .forEach(map -> {
                    map.setThirdStockNo(map1.getThirdStockNo());
                });*/
        List<AwardInfo> resultList2 = prizeRecords.stream().map(m->{
            stockDTOList.stream().filter(m2->Objects.equals(m.getStockNo(), m2.getStockNo()))
                    .forEach(s-> m.setThirdStockNo(s.getThirdStockNo()));
            return m;
        }).collect(Collectors.toList());
        /**
         * stockNo=4,5,6的结果没去掉!
         * [AwardInfo{userId='null', stockNo='1', thirdStockNo='third1'},
         * AwardInfo{userId='null', stockNo='2', thirdStockNo='third2'},
         * AwardInfo{userId='null', stockNo='3', thirdStockNo='third3'},
         * AwardInfo{userId='null', stockNo='4', thirdStockNo='null'},
         * AwardInfo{userId='null', stockNo='5', thirdStockNo='null'},
         * AwardInfo{userId='null', stockNo='6', thirdStockNo='null'}]
         */
        System.out.println(resultList2.toString());

        List<AwardInfo> list3 = prizeRecords.stream()
                .map(map -> stockDTOList.stream()
                        .filter(m -> Objects.equals(m.getStockNo(), map.getStockNo()))
                        .findFirst().map(m -> {
                            map.setThirdStockNo(m.getThirdStockNo());
                            return map;
                        }).orElse(null))
                .filter(Objects::nonNull).collect(Collectors.toList());
        /**
         * stockNo=4,5,6的结果已去掉
         * [AwardInfo{userId='null', stockNo='1', thirdStockNo='third1'},
         * AwardInfo{userId='null', stockNo='2', thirdStockNo='third2'},
         * AwardInfo{userId='null', stockNo='3', thirdStockNo='third3'}]
         */
        System.out.println(list3.toString());
    }
    static class StockInfo{
        private String stockNo;
        private String stockName;
        private String thirdStockNo;
        public String getStockNo() {
            return stockNo;
        }

        public void setStockNo(String stockNo) {
            this.stockNo = stockNo;
        }

        public String getStockName() {
            return stockName;
        }

        public void setStockName(String stockName) {
            this.stockName = stockName;
        }

        public String getThirdStockNo() {
            return thirdStockNo;
        }

        public void setThirdStockNo(String thirdStockNo) {
            this.thirdStockNo = thirdStockNo;
        }

        @Override
        public String toString() {
            return "StockInfo{" +
                    "stockNo='" + stockNo + '\'' +
                    ", stockName='" + stockName + '\'' +
                    ", thirdStockNo='" + thirdStockNo + '\'' +
                    '}';
        }
    }
    static class AwardInfo{
        private String userId;
        private String stockNo;
        private String thirdStockNo;
        public String getUserId() {
            return userId;
        }

        public void setUserId(String userId) {
            this.userId = userId;
        }

        public String getStockNo() {
            return stockNo;
        }

        public void setStockNo(String stockNo) {
            this.stockNo = stockNo;
        }

        public String getThirdStockNo() {
            return thirdStockNo;
        }

        public void setThirdStockNo(String thirdStockNo) {
            this.thirdStockNo = thirdStockNo;
        }

        @Override
        public String toString() {
            return "AwardInfo{" +
                    "userId='" + userId + '\'' +
                    ", stockNo='" + stockNo + '\'' +
                    ", thirdStockNo='" + thirdStockNo + '\'' +
                    '}';
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java8如何通过Lambda处理List集合

    这篇文章主要介绍了java8如何通过Lambda处理List集合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 8新增的Lambda表达式,我们可以用简洁高效的代码来处理List. 1.遍历 public static void main(String[] args) { List<User> userList = Lists.newArrayList(); User user1 = new User(1L, "张三&qu

  • java8 多个list对象用lambda求差集操作

    业务场景:调用同步接口获取当前全部有效账户,数据库已存在部分账户信息,因此需要筛选同步接口中已存在本地的帐户. 调用接口获取的数据集合 List<AccountVo> list = response.getData().getItems(); 本地查询出来的账户集合 List<Account> towList = accountRepository.findAll(); 筛选差集代码 List<AccountVo> distinctByUniqueList = list

  • Java8 lambda表达式2种常用方法代码解析

    与python不一样,python lambda是定义匿名函数,而在java8中lambda是匿名内部类 例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码.我们在这里做了什么呢?那就是用() -> {}代码块替代了整个匿名类. // Java 8之前: new Thread(ne

  • java8 forEach结合Lambda表达式遍历 List操作

    我就废话不多说了,大家还是直接看代码吧~ @Test void testJava8ForeachMap() { Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E&quo

  • Java8的Lambda遍历两个List匹配数据方式

    目录 Lambda遍历两个List匹配数据 1.定义一个静态方法 2.Main方法测试 3.输出结果 jdk1.8的stream对两个List遍历匹配数据的处理 Lambda遍历两个List匹配数据 1. 定义一个静态方法 /** * 通过遍历两个List中按id属性相等的归结到resultList中 * @param oneList * @param twoList */ public static List<Map<Object, Object>> compareListHit

  • python3用PyPDF2解析pdf文件,用正则匹配数据方式

    我就废话不多说了,大家还是看代码吧! import PyPDF2 import re pdf_file = open('xxx.pdf', mode='rb') read_pdf = PyPDF2.PdfFileReader(pdf_file) # 获取pdf文件的所有页数 number_of_pages = read_pdf.getNumPages() # print('total_page: ', number_of_pages) line_list = [] # 循环遍历每一页 for i

  • SQL查询之字段是逗号分隔开的数组如何查询匹配数据问题

    目录 字段是逗号分隔开的数组如何查询匹配数据 方式一:CHARINDEX***()***** 方式二:WHERE LIKE Mysql逗号分隔的字段查询 1.like 2.find_in_set 3.regexp 总结 字段是逗号分隔开的数组如何查询匹配数据 方式一:CHARINDEX***()***** SELECT     *  FROM     U_PUR1  WHERE     CHARINDEX( ',' + '100306' + ',', ',' + DeptCode + ',' )

  • Java8 Stream对两个 List 遍历匹配数据的优化处理操作

    使用场景,有两个List<Map<String,Object>>集合,第一个集合的所有元素都是需要保留的. 第一个集合的值为: {name=张三丰1, id=1} {name=张三丰2, id=2} {name=张三丰3, id=3} {name=张三丰4, id=4} {name=张三丰5, id=5} {name=张三丰6, id=6} {name=张三丰7, id=7} {name=张三丰8, id=8} 第二个集合的值为: {grade=61, id=1} {grade=6

  • java8之lambda表达式用法总结

    java8之lambda表达式 目的:行为参数化 Lambda表达式是简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. Lambda的基本语法是(parameters) -> expression 或 (parameters) -> { statements; }.其中, (parameters) -> expression 的表达式中隐含了return,如 () -> 42: (parameters) ->

  • Java8使用lambda实现Java的尾递归

    前言 本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用.众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类的循环通通可以用递归来实现,这类语言的编译器都对递归的尾递归形式进行了优化,而Java的编译器并没有这样的优化,本篇就要完成这样一个对于尾递归的优化. 什么是尾递归 本篇将使用递归中最简单的阶乘计算来作为例子 递归实现 /** * 阶乘计算 -- 递归解决 * * @param number 当前阶

  • Java8之lambda表达式基本语法

    lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public String getName() { return name; } public Double getS

  • Java8的Lambda表达式你真的会吗

    理解Lambda Lambda表达式可以是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为,也就是行为参数化,将不同的行为作为参数传入方法. 随着函数式编程思想的引进,Lambda表达式让可以用更加简洁流畅的代码来代替之前冗余的Java代码. 口说无凭,直接上个例子吧.在Java8之前,关于线程代码是这样的: class Task implements Runnable{ @Override public void run() { System.out.println("Ja

  • 一文带你掌握Java8中Lambda表达式 函数式接口及方法构造器数组的引用

    目录 函数式接口概述 函数式接口示例 1.Runnable接口 2.自定义函数式接口 3.作为参数传递 Lambda 表达式 内置函数式接口 Lambda简述 Lambda语法 方法引用 构造器引用 数组引用 函数式接口概述 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象. 可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口.同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口.

  • Java8中Lambda表达式的理解与应用

    目录 简介 正文 1. lambda的语法 2. 为啥引入lambda 3. 什么是函数式接口 4. 什么是行为参数化 5. 手写一个函数式接口 6. 常用的函数式接口 7. 什么是方法引用 8. 什么是构造引用 9. lambda表达式中引入外部变量的限制 10. lambda的组合操作 总结 简介 Lambda表达式是一个可传递的代码块,可以在以后执行一次或多次: 下面贴个对比代码: // Java8之前:旧的写法 Runnable runnable = new Runnable() { @

随机推荐