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=62, id=2}
{grade=63, id=3}
{grade=64, id=4}

需要根据两个集合中id值相同,就把第二个集合中的grade值赋给第一个集合,如果不匹配,默认grade值为0

结果是这样:

{grade=61, name=张三丰1, id=1}
{grade=62, name=张三丰2, id=2}
{grade=63, name=张三丰3, id=3}
{grade=64, name=张三丰4, id=4}
{grade=0, name=张三丰5, id=5}
{grade=0, name=张三丰6, id=6}
{grade=0, name=张三丰7, id=7}
{grade=0, name=张三丰8, id=8}

具体实现代码:

  @Test
  public void demo01(){
    List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
    for (int i=1;i<9;i++){
      Map<String,Object> map = new HashMap<>();
      map.put("id",i);
      map.put("name","张三丰"+i);
      list.add(map);
    }
    Stream<Map<String, Object>> s1 = list.stream();
    list.stream().forEach(map-> System.out.println(map));

    List<Map<String,Object>> list2 = new ArrayList<Map<String,Object>>();
    for (int i=1;i<5;i++){
      Map<String,Object> map2 = new HashMap<>();
      map2.put("id",i);
      map2.put("grade",i+60);
      list2.add(map2);
    }
    list2.stream().forEach(s-> System.out.println(s));
/**
 * 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);
 *           map.put("grade",90);
 *           return map;
 *         }).orElse(null))
      *         .filter(Objects::nonNull).collect(Collectors.toList());
 */
   /* List<Map<String, Object>> resultList2 = list.stream().map(m->{
          m.put("grade",0);
          for (int i=0;i<list2.size();i++){
            if(m.get("id").equals(list2.get(i).get("id"))){
              m.put("grade",list2.get(i).get("grade"));
              break;
            }
          }
          return m;
        }).collect(Collectors.toList());*/
    List<Map<String, Object>> resultList2 = list.stream().map(m->{
      m.put("grade",0);
      list2.stream().filter(m2->Objects.equals(m.get("id"), m2.get("id"))).forEach(s-> m.put("grade",s.get("grade")));
      return m;
    }).collect(Collectors.toList());
    resultList2.stream().forEach(s-> System.out.println(s));
  }

补充知识:Java-8新特性-通过Stream获取两个List复杂对象的交并差集

思路:首先获取两个list的id,通过id比较获取id的交并差集,再通过一次获取list对象里面的交并差集元素

代码直接可运行,个人觉得java8的stream非常类似ES6的集合运算,filter、foreach、map、reduce基本可以一一对应

代码:

package com.stream;

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

/**
 *
 * @ClassName: TwoListCopare
 * @Description: 两个List<对象>取交集\并集\差集</>
 **/
public class TwoListCopare {
  public static void main(String[] args) {
    UserDTO userOld1 = new UserDTO("1","aaa",22);
    UserDTO userOld2 = new UserDTO("2","bbb",32);
    UserDTO userOld3 = new UserDTO("3","ccc",11);
    UserDTO userOld4 = new UserDTO("4","ddd",42);
    UserDTO userOld5 = new UserDTO("5","bbb",22);
    UserDTO userOld6 = new UserDTO("6","eee",24);

    UserDTO userNew1 = new UserDTO("7","dada",22);   //新增一个
    UserDTO userNew2 = new UserDTO("2","bbb",32);   //不变一个
    UserDTO userNew3 = new UserDTO("3","kaka",33);   //更新一个
    UserDTO userNew4 = new UserDTO("8","dbdb",42);   //新增一个
    UserDTO userNew5 = new UserDTO("5","bbb",100);   //更新一个
    //当然,少了1,4,6

    List<UserDTO> mapAdd = new ArrayList<>();

    List<UserDTO> oldList = new ArrayList<>();
    List<UserDTO> newList = new ArrayList<>();

    //添加老数据
    oldList.add(userOld1);
    oldList.add(userOld2);
    oldList.add(userOld3);
    oldList.add(userOld4);
    oldList.add(userOld5);
    oldList.add(userOld6);
    //添加新数据
    newList.add(userNew1);
    newList.add(userNew2);
    newList.add(userNew3);
    newList.add(userNew4);
    newList.add(userNew5);

    //去交集,既获取id相同的交集,需要更新
    //1.先提取出id和结果,用map形式
    List<String> oldIds = new ArrayList<>();
    List<String> newIds = new ArrayList<>();
    oldList.stream().forEach(it->oldIds.add(it.getId()));
    newList.stream().forEach(it->newIds.add(it.getId()));
//    oldIds.stream().forEach(System.out::println);
//    newIds.stream().forEach(System.out::println);

    //取交集id
    System.out.println("-----------------交集----------------------");
    List<String> collectUpdate = newIds.stream().filter(it -> oldIds.contains(it)).collect(Collectors.toList());
    collectUpdate.stream().forEach(System.out::println);
    //取对应交集的对象
    System.out.println("------------------交集的对象---------------------");
    List<UserDTO> userUpdate = newList.stream().filter(it -> collectUpdate.contains(it.getId())).collect(Collectors.toList());
    userUpdate.stream().forEach(System.out::println);

    //取old的差集
    System.out.println("-----------------old的差集----------------------");
    List<String> collectDelete = oldIds.stream().filter(it -> !newIds.contains(it)).collect(Collectors.toList());
    collectDelete.stream().forEach((System.out::println));
    //取对应old差集对象
    System.out.println("-----------------old差集对象----------------------");
    List<UserDTO> userDelete = oldList.stream().filter(it -> collectDelete.contains(it.getId())).collect(Collectors.toList());
    userDelete.stream().forEach(System.out::println);

    //取new的差集
    System.out.println("-----------------new的差集----------------------");
    List<String> collectAdd = newIds.stream().filter(it -> !oldIds.contains(it)).collect(Collectors.toList());
    collectAdd.stream().forEach((System.out::println));
    //取对应old差集对象
    System.out.println("-------------------old差集对象--------------------");
    List<UserDTO> userAdd = newList.stream().filter(it -> collectAdd.contains(it.getId())).collect(Collectors.toList());
    userAdd.stream().forEach(System.out::println);

    //取并集
    System.out.println("-------------------并集--------------------");
    List<String> allIds = new ArrayList<>();
    //获取一个包含了oldIds和newIds的总结合,但是没有去重
    allIds.addAll(oldIds);
    allIds.addAll(newIds);
    //去重,获取并集ids的新集合
    List<String> joinIds = allIds.stream().distinct().collect(Collectors.toList());
    joinIds.stream().forEach(System.out::println);
  }
}

结果:

ps:并集对象集合并没有写,因为能够得到判断id自然就能得到了

以上这篇Java8 Stream对两个 List 遍历匹配数据的优化处理操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java8 利用reduce实现将列表中的多个元素的属性求和并返回操作

    利用java8流的特性,我们可以实现list中多个元素的 属性求和 并返回. 案例: 有一个借款待还信息列表,其中每一个借款合同包括:本金.手续费: 现在欲将 所有的本金求和.所有的手续费求和. 我们可以使用java8中的函数式编程,获取list的流,再利用reduce遍历递减方式将同属性(本金.手续费)求和赋予给一个新的list中同类型的对象实例,即得到我们需要的结果: A a = list.stream() .reduce( (x , y) -> new A( (x.getPrincipal

  • java8新特性 stream流的方式遍历集合和数组操作

    前言: 在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为要进行遍历,但是遍历不是唯一的方式,遍历是指每一个元素逐一进行处理(目的),而并不是从第一个到最后一个顺次处理的循环,前者是目的,后者是方式. 所以为了让遍历的方式更加优雅,出现了流(stream)! 1.流的目的在于强掉做什么 假设一个案例:将集合A根据条件1过滤为子集B,然后根据条件2过滤为子集C 在没有引入流之前我们的做法可能为: public cl

  • java8从list集合中取出某一属性的值的集合案例

    我就废话不多说了,大家还是直接看代码吧~ List<Order> list = new ArrayList<User>(); Order o1 = new Order("1","MCS-2019-1123"); list.add(o1 ); Order o2= new Order("2","MCS-2019-1124"); list.add(o2); Order o3= new Order("

  • Java Integer.valueOf()和Integer.parseInt()的区别说明

    前言 大家都知道Integer类中有Integer.valueOf(String s)和Integer.parseInt(String s)两个静态方法,他们都能够将字符串转换为整型.说到这里你肯定会想同一个功能为什么要提供两个不同的方法,这不是浪费吗? 区别 Integer.parseInt(String s)将会返回int常量. Integer.valueOf(String s)将会返回Integer类型,如果存在缓存将会返回缓存中已有的对象. 使用不当将会产生的问题 由于Java的自动拆箱

  • 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 Stream list to Map key 重复 value合并到Collectio的操作

    java8 Stream list to Map key 重复 value合并到Collectio 关于把list转换成key value的map有很多博客上都有实现,这里是一个把value放入到集合中去 List<String> list = Lists.newArrayList("1", "2", "3", "1"); Map<String, List<String>> map = li

  • 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

  • JAVA8 stream中三个参数的reduce方法对List进行分组统计操作

    背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中就包括_.groupBy 和 _.reduce,即分组和'聚合'(reduce不知道该怎么翻译合适). 使用这些'野生'的API能够极大的提高我本人编写JS代码的效率.而JAVA8开始支持stream和lambda表达式,这些和lodash的API有很多类似的功能.因此我在熟悉lodash的前提下尝

  • 5分钟让你快速掌握java8 stream常用开发技巧

    前言 如果有些朋友以前没有使用过java8 stream这种链式编程方式做开发,想学习一下. 如果有些朋友只学习了一部分用法,想学习更多. 如果有些朋友想看看有没有好的示例适用于实际工作当中. 那么恭喜你,这篇文章非常适合你. 首先,我们一起看看stream的继承关系: Stream.IntStream.LongStream.DoubleStream的父接口都是BaseStream.BaseStream的四个子接口方法都差不多,只是IntStream.LongStream.DoubleStrea

  • Java8 Stream中间操作实例解析

    这篇文章主要介绍了Java8 Stream中间操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍Stream Stream 使用一种类似用于SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象. Stream API可以极大提高Java程序员的生产力,让程序员写出高效率.干净.简洁的代码. 这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等

  • 浅谈java8 stream flatMap流的扁平化操作

    概念: Steam 是Java8 提出的一个新概念,不是输入输出的 Stream 流,而是一种用函数式编程方式在集合类上进行复杂操作的工具.简而言之,是以内部迭代的方式处理集合数据的操作,内部迭代可以将更多的控制权交给集合类.Stream 和 Iterator 的功能类似,只是 Iterator 是以外部迭代的形式处理集合数据的操作. 在Java8以前,对集合的操作需要写出处理的过程,如在集合中筛选出满足条件的数据,需要一 一遍历集合中的每个元素,再把每个元素逐一判断是否满足条件,最后将满足条件

  • Java8 stream 中利用 groupingBy 进行多字段分组求和案例

    Java8的groupingBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 对集合按照单个属性分组.分组计数.排序 List<String> items = Arrays.asList("apple", "apple", "banana", "apple", "orange", "banana", "papaya");

  • 用Java8 stream处理数据

    目录 1.stream处理数据介绍 2.Stream起步 3.Stream与Collection比较 1.stream处理数据介绍 如果没有集合Collection你如何处理数据?几乎所有的Java应用程序都要使用Collection处理数据.他们是十分重要的编程工作:例如,您可能想要创建银行交易的集合Collection,这个集合代表客户的状态.然后,你可能要处理整个集合来找出的顾客花了多少钱.尽管集合如此重要,但是在Java中处理集合的技术还远远不够完善. 首先,对集合的典型处理模式是类似S

  • Java8 Stream 流常用方法合集

    目录 一.概述 二.分类 三.具体用法 1. 流的常用创建方法 2. 流的中间操作 3. 流的终止操作 一.概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询.也可以使用 Stream API 来并行执行操作. 简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式. 特点: 不是数据结构,不会保存数据.

随机推荐