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使用觀察者模式實現(xiàn)氣象局高溫預警功能示例
這篇文章主要介紹了Java使用觀察者模式實現(xiàn)氣象局高溫預警功能,結(jié)合完整實例形式分析了java觀察者模式實現(xiàn)氣象局高溫預警的相關(guān)接口定義、使用、功能操作技巧,并總結(jié)了其設計原則與適用場合,具有一定參考借鑒價值,需要的朋友可以參考下2018-04-04Spring?Boot?實現(xiàn)字段唯一校驗功能(實例代碼)
這篇文章主要介紹了Spring?Boot?實現(xiàn)字段唯一校驗,實現(xiàn)代碼很簡單,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08MyBatis中的表關(guān)聯(lián)查詢實現(xiàn)示例
這篇文章主要介紹了MyBatis中的表關(guān)聯(lián)查詢實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01spring boot切面execution表達式添加多個包路徑問題及解決方案
在Spring Boot中,如果你想為多個包中的方法創(chuàng)建一個切面,你可以在@Pointcut注解中使用||操作符來指定多個包,下面給大家分享spring boot切面execution表達式添加多個包路徑問題及解決方案,感興趣的朋友跟隨小編一起看看吧2024-03-03