1. 程式人生 > 實用技巧 >對兩個List進行關聯匹配,選擇匹配上的記錄形成新的List輸出

對兩個List進行關聯匹配,選擇匹配上的記錄形成新的List輸出

Java 8 Stream ConvertStream<List<String>> to List<String>

【目標】:對兩個集合中的元素通過特定指標進行匹配,重新組合匹配成功的元素。(如下圖:)

【說明】:對兩個集合 listA、listB 依據 field1 欄位進行匹配,若匹配成功,則取出 listA 中的 field0、field1 和 listB 中的 field2 組合成新元素;多個匹配項形成新的 list:commonList.

【關鍵】:java8 Stream處理: list.stream().*其他操作*().flatMap() 實現合併。

【關鍵程式碼示例】:

【完整程式碼示例】:

 1     @Data
 2     class User{
 3         public User() {
 4         }
 5         public User(String userName, int age) {
 6             this.userName = userName;
 7             this.age = age;
 8         }
 9         public User(String userName, int age, String info) {
10             this
.userName = userName; 11 this.age = age; 12 this.info = info; 13 } 14 15 private String userName; 16 private int age; 17 private String info; 18 } 19 20 @Test 21 public void test(){ 22 List<User> userListA = Arrays.asList(
23 new User("關羽", 666), 24 new User("趙雲", 666), 25 new User("張飛", 666), 26 new User("劉備", 666)); 27 List<User> userListB = Arrays.asList( 28 new User("關羽", 999, "武財神"), 29 new User("關雲長", 999, "忠義"), 30 new User("關公", 999, "漢壽亭侯"), 31 new User("趙子龍", 999, "永昌亭侯")); 32 33 List<String> commonList = userListA.stream() 34 .map((uA) -> { 35 return userListB.stream() 36 .filter((uB) -> { 37 return StringUtils.equals(uB.getUserName(), uA.getUserName()); 38 }) 39 .map((uB) -> { 40 return uB.getUserName() + "_" + uA.age + "_" +uB.getInfo(); 41 }) 42 .collect(Collectors.toList()); 43 }) // 結果型別 Steam<List<String>> 44 .flatMap(List::stream) // 結果型別 Steam<String> 45 .collect(Collectors.toList()); // 結果型別 List<String> 46 47 System.out.println(JsonUtils.objectToJson(commonList)); // ["關羽_666_武財神"] 48 } 49 }