一、合并出共有部分
package com.xu.demo.test;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class ListMergeTest1 {public static void main(String[] args) {List<User> list1 = Arrays.asList(new User(1, "Alice"), new User(2, "Bob"), new User(4, "Ronnie"));List<User> list2 = Arrays.asList(new User(2, "Bobby"), new User(3, "Charlie"), new User(5, "Trump"));List<User> mergedList = list1.stream().flatMap(user1 -> list2.stream().filter(user2 -> user1.getId() == user2.getId()).map(user2 -> {User newUser = new User();newUser.setId(user2.getId());newUser.setName(user2.getName());return newUser;})).collect(Collectors.toList());mergedList.forEach(System.out::println);}}class User {private int id;private String name;public User(int id, String name) {this.id = id;this.name = name;}// Getter and Setter methodspublic int getId() {return id;}public String getName() {return name;}public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}public User() {}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}
}
运行结果:注意流处理中return的位置
二、合并到某一List(假如保留到第一个List)
package com.xu.demo.test;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class ListMergeTest2 {public static void main(String[] args) {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);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);System.out.println(list1);System.out.println(list2);//使用stream流把list1和list2根据属性userId合并一个list集合list1.stream().map(m1 -> {list2.stream().filter(m2 -> m1.get("userId").equals(m2.get("userId"))).forEach( m2 -> {m1.put("gender", m2.get("gender"));m1.put("age", m2.get("age"));});return m1;}).collect(Collectors.toList());System.out.println(list1);System.out.println(list2);}}
运行结果如下:注意流处理中return的位置
三、合并成新对象列表
package com.xu.demo.test;import com.alibaba.fastjson.JSON;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {new Test().test();}public void test(){List<Person> userListA = Arrays.asList(new Person("关羽", 926),new Person("赵云", 916),new Person("张飞", 906),new Person("许褚", 911));List<Rule> userListB = Arrays.asList(new Rule("关羽", "字·云长-关公-武财神-汉寿亭侯"),new Rule("张飞", "字·益德-勇武过人-西乡侯"),new Rule("刘备", "字·玄德-百折不挠-汉昭烈帝"),new Rule("赵云", "字·子龙-忠义-永昌亭侯"),new Rule("周瑜", "字·公瑾-文武兼备-永昌亭侯"),new Rule("许褚", "字·仲康-勇力绝人-虎侯"));List<Hero> commonList = userListA.stream().map(uA -> userListB.stream().filter(uB1 -> StringUtils.equals(uB1.getUserName(), uA.getUserName())).map(uB2 -> new Hero(uB2.getUserName(), uA.getBloodVolume(), uB2.getAlign())).collect(Collectors.toList())) // 结果类型 Steam<List<Hero>>.flatMap(List::stream) // 结果类型 Steam<Hero>.collect(Collectors.toList()); // 结果类型 List<Hero>System.out.println(JSON.toJSONString(commonList));// [{"align":"字·云长-关公-武财神-汉寿亭侯","bloodVolume":926,"userName":"关羽"},// {"align":"字·子龙-忠义-永昌亭侯","bloodVolume":916,"userName":"赵云"},// {"align":"字·益德-勇武过人-西乡侯","bloodVolume":906,"userName":"张飞"},// {"align":"字·仲康-勇力绝人-虎侯","bloodVolume":911,"userName":"许褚"}]}
}@Data
class Person {private String userName;private int bloodVolume;public Person(String userName, int bloodVolume) {this.userName = userName;this.bloodVolume = bloodVolume;}
}@Data
class Rule {private String userName;private String align;public Rule(String userName, String align) {this.userName = userName;this.align = align;}
}@Data
class Hero {private String userName;private int bloodVolume;private String align;public Hero(String userName, int bloodVolume, String align) {this.userName = userName;this.bloodVolume = bloodVolume;this.align = align;}
}
Java8的流式处理提供了大量强大而且简单的数据(结构)处理,一定要好好总结学习,对你的编程思维和能能力的提高大有好处。