Java怎麼把多個物件的list的資料合併

TechSynapse發表於2024-09-12

1.示例一:建立幾個包含Person物件的List,並將它們合併成一個新的List

在Java中,將多個物件的List合併通常涉及到遍歷這些List並將它們的元素新增到一個新的List中。這裡,我將給出一個詳細的程式碼示例,該示例將展示如何將多個包含相同型別物件的List合併成一個List。

假設我們有一個簡單的Person類,它有兩個屬性:nameage。我們將建立幾個包含Person物件的List,並將它們合併成一個新的List。

首先,定義Person類:

public class Person {  
    private String name;  
    private int age;  
  
    // 構造方法  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    // Getter和Setter  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    // toString方法,便於列印Person物件  
    @Override  
    public String toString() {  
        return "Person{" +  
                "name='" + name + '\'' +  
                ", age=" + age +  
                '}';  
    }  
}

接下來,編寫合併List的程式碼:

import java.util.ArrayList;  
import java.util.List;  
  
public class ListMerger {  
    public static void main(String[] args) {  
        // 建立三個List,每個List包含幾個Person物件  
        List<Person> list1 = new ArrayList<>();  
        list1.add(new Person("Alice", 30));  
        list1.add(new Person("Bob", 25));  
  
        List<Person> list2 = new ArrayList<>();  
        list2.add(new Person("Charlie", 35));  
        list2.add(new Person("David", 40));  
  
        List<Person> list3 = new ArrayList<>();  
        list3.add(new Person("Eve", 28));  
  
        // 合併這些List  
        List<Person> mergedList = mergeLists(list1, list2, list3);  
  
        // 列印合並後的List  
        System.out.println(mergedList);  
    }  
  
    // 合併多個List的方法  
    public static <T> List<T> mergeLists(List<T>... lists) {  
        List<T> mergedList = new ArrayList<>();  
        for (List<T> list : lists) {  
            if (list != null) {  
                mergedList.addAll(list);  
            }  
        }  
        return mergedList;  
    }  
}

在這個示例中,我們首先定義了Person類,併為其提供了基本的構造方法、Getter和Setter方法,以及一個toString方法以便於列印。

然後,在ListMerger類中,我們建立了三個包含Person物件的List,並使用mergeLists方法將它們合併。mergeLists方法接受一個可變數量的List引數(透過List<T>... lists實現),然後遍歷這些List,並使用addAll方法將它們新增到mergedList中。注意,在新增之前,我們檢查了List是否為null,儘管在這個特定的例子中我們並沒有建立null的List。

最後,我們列印了合併後的List,展示了合併的效果。

這個示例提供了將多個物件的List合併成一個List的詳細步驟,並且程式碼可以直接執行,具有實際的參考價值和意義。

2.示例二:使用Java 8的Stream API

如果我們使用的是Java 8或更高版本,可以利用Stream API來更簡潔地合併List。

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  
import java.util.stream.Collectors;  
import java.util.stream.Stream;  
  
public class ListMergerStream {  
    public static void main(String[] args) {  
        List<Person> list1 = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));  
        List<Person> list2 = Arrays.asList(new Person("Charlie", 35), new Person("David", 40));  
        List<Person> list3 = Arrays.asList(new Person("Eve", 28));  
  
        // 使用Stream API合併List  
        List<Person> mergedList = Stream.of(list1, list2, list3)  
                .flatMap(List::stream)  
                .collect(Collectors.toList());  
  
        // 列印合並後的List  
        mergedList.forEach(System.out::println);  
    }  
  
    // 假設Person類和其他部分與之前的示例相同  
}

在這個示例中,Stream.of(list1, list2, list3)建立了一個包含所有List的Stream,然後flatMap(List::stream)將這個Stream中的每個List轉換成一個新的Stream,並將這些Stream合併成一個Stream,最後透過collect(Collectors.toList())收集到一個新的List中。

3.示例三:使用Apache Commons Collections

如果我們在我們的專案中使用了Apache Commons Collections庫,我們可以利用CollectionUtils.union方法來合併List。但請注意,CollectionUtils.union返回的是一個新的集合,它包含了所有給定集合的元素的檢視,但這些元素並不保證是唯一的(除非原始集合中的元素本身就是唯一的)。

然而,對於List的合併,我們可能需要一個確實包含所有元素的新List,而不是一個檢視。因此,我們可能需要將結果轉換為一個新的List。但Apache Commons Collections本身可能沒有直接的方法來做到這一點,所以我們可能仍然需要一些額外的步驟。不過,對於簡單的合併操作,我們通常會使用Java標準庫中的方法或Stream API。

但如果我們確實想使用Apache Commons Collections,並且想要一個包含所有元素的新List,我們可以這樣做:

import org.apache.commons.collections4.CollectionUtils;  
  
import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.Collection;  
import java.util.List;  
  
public class ListMergerApache {  
    public static void main(String[] args) {  
        // 假設list1, list2, list3已經定義並初始化  
  
        // 使用Apache Commons Collections的CollectionUtils來合併(但注意這不是直接支援List的合併)  
        // 一個簡單的方法是使用ArrayList的構造器來接收一個Collection  
        List<Person> mergedList = new ArrayList<>(CollectionUtils.union(list1, list2, list3));  
  
        // 注意:如果list中有重複元素,並且我們想要去重,我們可能需要額外的步驟  
  
        // 列印合並後的List  
        mergedList.forEach(System.out::println);  
    }  
  
    // 假設Person類和其他部分與之前的示例相同  
  
    // 注意:CollectionUtils.union在Apache Commons Collections 4中可用,並且它接受可變數量的Collection引數  
}

但請注意,上面的程式碼示例中的CollectionUtils.union實際上並不直接支援可變數量的List作為引數,而是支援可變數量的Collection。因此,上面的程式碼示例在技術上可能不是完全準確的,因為CollectionUtils.union的常用過載方法只接受兩個Collection引數。如果我們需要合併多於兩個的List,我們可能需要連續呼叫union或使用其他方法(如Java標準庫中的方法或Stream API)。

在實際應用中,由於Java標準庫已經提供了強大且靈活的工具(如Stream API),因此通常不需要額外依賴Apache Commons Collections來執行基本的集合操作。

相關文章