この記事では、Plain Java、Java 8、Guava、および Apache Commons Collections を使用して 2 つの Java リストを結合する方法について説明します。
1. 純粋な Java
使用List.addAll()
List
このインターフェイスは、addAll(Collection)
指定されたコレクションのすべての要素をリストの末尾に追加するメソッドを提供します。次のように使用できます。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
List<T> list = new ArrayList<>();
list.addAll(list1);
list.addAll(list2);
return list;
}
また、結果リストのコンストラクターを最初のリストで初期化しArrayList
、余分な呼び出しを防ぐこともできますaddAll()
。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
List<T> list = new ArrayList<>(list1);
list.addAll(list2);
return list;
}
二重中括弧の初期化
インスタンス初期化子を含む匿名内部クラスを内部的に作成する二重中括弧初期化を使用することもできます。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
return new ArrayList<T>() {
{
addAll(list1);
addAll(list2);
}};
}
このテクニックを使用するたびに追加のクラスが必要になるため、このテクニックは避けた方がよいでしょう。また、それを囲んでいるインスタンスおよびキャプチャされたオブジェクトへの非表示の参照も含まれています。これにより、メモリ リークやシリアル化の問題が発生する可能性があります。
使用Collections.addAll()
このCollections
クラスは、コレクションを操作するいくつかの便利な静的ユーティリティ メソッドを提供します。そのような方法の 1 つは、addAll(Collection, T[])
指定されたすべての要素を指定されたコレクションに追加することです。
// 在 Java 中连接两个列表的方法
public static List<String> merge(List<String> list1, List<String> list2)
{
List<String> list = new ArrayList<>();
Collections.addAll(list, list1.toArray(new String[0]));
Collections.addAll(list, list2.toArray(new String[0]));
return list;
}
このメソッドは に似ていますList.addAll()
が、より高速に実行される可能性があります。
2. Java 8の使用
Java 8 Stream を使用して 2 つのリストを結合することもできます。
使用Stream.of()
してflatMap()
ここでは、静的ファクトリ メソッドを使用して両方のリストから要素のストリームを取得し、 CollectorStream.of()
を使用してすべての要素を新しいリストに蓄積しました。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
return Stream.of(list1, list2)
.flatMap(x -> x.stream())
.collect(Collectors.toList());
}
使用Stream.of()
してStream.forEach()
forEach()
次のように、代わりにすべての要素を蓄積することで、コレクターの使用を回避できます。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
List<T> list = new ArrayList<>();
Stream.of(list1, list2).forEach(list::addAll);
return list;
}
使用Stream.concat()
Java ストリームは、concat()
2 つのストリームを入力として受け取り、最初のストリームのすべての要素とその後に 2 番目のストリームのすべての要素が続く遅延結合ストリームを作成します。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
return Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.toList());
}
使用List.addAll()
List.addAll()
ここでは、Java 8 以降でストリームを使用する前述の方法を少し変更したものを示します。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
List<T> list = list1.stream().collect(Collectors.toList());
list.addAll(list2);
return list;
}
3. Guava ライブラリの使用
Guava のIterables
クラスは、 type のオブジェクトを操作したり返したりするための静的ユーティリティ メソッドを多数提供しますIterable
。
使用Iterables.concat()
concat()
2 つの反復可能を 1 つの反復可能に結合するために使用できます。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2) {
return Lists.newArrayList(Iterables.concat(list1, list2));
}
使用Iterables.addAll()
addAll()
反復可能オブジェクトのすべての要素をコレクションに追加します。そのメソッドは Collections と同様の方法で使用できますaddAll()
。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
List<T> list = Lists.newArrayList();
Iterables.addAll(list, list1);
Iterables.addAll(list, list2);
return list;
}
4. Apache Commons コレクションの使用
Apache Commons CollectionsListUtils
クラスは、union()
2 つのリストを入力として受け取り、最初のリストに 2 番目のリストが追加された新しいリストを返すメソッドを提供します。
// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2) {
return ListUtils.union(list1, list2);
}
Java で 2 つのリストを結合する方法はこれですべてです。