欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作

 更新時間:2020年08月17日 09:59:12   作者:yang名揚  
這篇文章主要介紹了Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

使用場景,有兩個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}

需要根據(jù)兩個集合中id值相同,就把第二個集合中的grade值賦給第一個集合,如果不匹配,默認grade值為0

結(jié)果是這樣:

{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}

具體實現(xiàn)代碼:

  @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<>();
 
    //添加老數(shù)據(jù)
    oldList.add(userOld1);
    oldList.add(userOld2);
    oldList.add(userOld3);
    oldList.add(userOld4);
    oldList.add(userOld5);
    oldList.add(userOld6);
    //添加新數(shù)據(jù)
    newList.add(userNew1);
    newList.add(userNew2);
    newList.add(userNew3);
    newList.add(userNew4);
    newList.add(userNew5);
 
    //去交集,既獲取id相同的交集,需要更新
    //1.先提取出id和結(jié)果,用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的總結(jié)合,但是沒有去重
    allIds.addAll(oldIds);
    allIds.addAll(newIds);
    //去重,獲取并集ids的新集合
    List<String> joinIds = allIds.stream().distinct().collect(Collectors.toList());
    joinIds.stream().forEach(System.out::println);
  }
}

結(jié)果:

ps:并集對象集合并沒有寫,因為能夠得到判斷id自然就能得到了

以上這篇Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java map存放數(shù)組并取出值代碼詳解

    Java map存放數(shù)組并取出值代碼詳解

    這篇文章主要介紹了Java map存放數(shù)組并取出值代碼詳解的相關(guān)內(nèi)容,小編覺得挺不錯的,這里給大家分享一下,需要的朋友可以參考。
    2017-10-10
  • Java使用觀察者模式實現(xiàn)氣象局高溫預警功能示例

    Java使用觀察者模式實現(xiàn)氣象局高溫預警功能示例

    這篇文章主要介紹了Java使用觀察者模式實現(xiàn)氣象局高溫預警功能,結(jié)合完整實例形式分析了java觀察者模式實現(xiàn)氣象局高溫預警的相關(guān)接口定義、使用、功能操作技巧,并總結(jié)了其設計原則與適用場合,具有一定參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • 解決Feign獲取異常信息的處理方案

    解決Feign獲取異常信息的處理方案

    這篇文章主要介紹了解決Feign獲取異常信息的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring?Boot?實現(xiàn)字段唯一校驗功能(實例代碼)

    Spring?Boot?實現(xiàn)字段唯一校驗功能(實例代碼)

    這篇文章主要介紹了Spring?Boot?實現(xiàn)字段唯一校驗,實現(xiàn)代碼很簡單,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • MyBatis中的表關(guān)聯(lián)查詢實現(xiàn)示例

    MyBatis中的表關(guān)聯(lián)查詢實現(xiàn)示例

    這篇文章主要介紹了MyBatis中的表關(guān)聯(lián)查詢實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 使用自定義注解實現(xiàn)redisson分布式鎖

    使用自定義注解實現(xiàn)redisson分布式鎖

    這篇文章主要介紹了使用自定義注解實現(xiàn)redisson分布式鎖,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中Calendar時間操作常用方法詳解

    Java中Calendar時間操作常用方法詳解

    這篇文章主要為大家詳細介紹了Java中Calendar時間操作常用方法,calendar中set方法和靜態(tài)屬性帶來的一些坑,感興趣的小伙伴們可以參考一下
    2016-05-05
  • struts升級到2.5.2遇到的問題及解決方案(推薦)

    struts升級到2.5.2遇到的問題及解決方案(推薦)

    原來的版本是2.3.x,由于安全原因需要升級到2.5.2。但是在升級過程中遇到各種各樣的問題,下面小編給大家?guī)砹藄truts升級到2.5.2遇到的問題及解決方案,需要的朋友參考下吧
    2016-11-11
  • spring boot切面execution表達式添加多個包路徑問題及解決方案

    spring boot切面execution表達式添加多個包路徑問題及解決方案

    在Spring Boot中,如果你想為多個包中的方法創(chuàng)建一個切面,你可以在@Pointcut注解中使用||操作符來指定多個包,下面給大家分享spring boot切面execution表達式添加多個包路徑問題及解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Spring Boot中實現(xiàn)定時任務應用實踐

    Spring Boot中實現(xiàn)定時任務應用實踐

    定時任務一般是項目中都需要用到的,可以用于定時處理一些特殊的任務。下面這篇文章主要給大家介紹了關(guān)于Spring Boot中實現(xiàn)定時任務應用實踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-05-05

最新評論