1. 序章

このクイックチュートリアルでは、Javaでコレクションを組み合わせるさまざまな方法について説明します。

Javaと、Guava、Apacheなどの外部フレームワークを使用したさまざまなアプローチについて説明します。 コレクションの紹介については、こちらのシリーズをご覧ください。

2. コレクションを操作するための外部ライブラリ 

ネイティブアプローチに加えて、外部ライブラリも使用します。 pom.xmlに次の依存関係を追加してください。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.2</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-exec</artifactId>
    <version>1.3</version>
</dependency>
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

最新バージョンは、 Commons Commons-exec 、およびGuavaのMavenCentralにあります。

3. Javaでの配列の組み合わせ

3.1. ネイティブJavaソリューション

Javaには、特定のソース配列を宛先配列にコピーする組み込みの void arraycopy()メソッドが付属しています。

次のように使用できます。

Object[] combined = new Object[first.length + second.length];
System.arraycopy(first, 0, combined, 0, first.length);
System.arraycopy(second, 0, combined, first.length, second.length);

このメソッドでは、配列オブジェクトとともに、コピーする必要のある位置も指定し、長さパラメーターも渡します。

これはネイティブJavaソリューションであるため、外部ライブラリは必要ありません。

3.2. Java 8 StreamAPIの使用

ストリームは、いくつかの異なるタイプのコレクションを反復処理する効果的な方法を提供します。 ストリームの使用を開始するには、 Java 8StreamAPIチュートリアルに進んでください。

Stream を使用して配列を組み合わせるには、次のコードを使用できます。

Object[] combined = Stream.concat(Arrays.stream(first), Arrays.stream(second)).toArray();

Stream.concat()は、最初のストリームの要素の後に2番目のストリームの要素が続く連結ストリームを作成します。その後、 toArray()を使用して配列に変換されます。 ]方法。

ストリームを作成するプロセスは、さまざまなタイプのコレクションで同じです。 ただし、さまざまな方法で収集して、さまざまなデータ構造を取得できます。

この方法については、セクション4.2で再検討します。 および5.2。 リストセットで同じ方法を使用する方法を確認します。

3.3. ApacheCommonsのArrayUtilsを使用する

Apache Commonsライブラリは、 ArrayUtilsパッケージのaddAll()メソッドを提供します。 宛先配列とソース配列をパラメーターとして指定できます。このメソッドは、結合された配列を返します。

Object[] combined = ArrayUtils.addAll(first, second);

この方法については、 Apache Commons Lang3を使用した配列処理の記事でも詳しく説明されています。

3.4. グアバの使用

Guavaは、同じ目的で concat()メソッドを提供します。

Object [] combined = ObjectArrays.concat(first, second, Object.class);

さまざまなデータ型で使用でき、クラスリテラルとともに2つのソース配列を受け入れて、結合された配列を返します。

4. リストをJavaに組み合わせる

4.1. コレクションネイティブaddAll()メソッドの使用

Collection インターフェイス自体は、 addAll()メソッドを提供します。このメソッドは、指定されたコレクション内のすべての要素を呼び出し元オブジェクトに追加します。 これについては、このBaeldungの記事でも詳しく説明されています。

List<Object> combined = new ArrayList<>();
combined.addAll(first);
combined.addAll(second);

このメソッドは、Collectionsフレームワークの最も親のインターフェイスである Collection インターフェイスで提供されるため、すべてのListおよびSetに適用できます。

4.2. Java8の使用

StreamCollectorsを次のように使用して、Listsを組み合わせることができます。

List<Object> combined = Stream.concat(first.stream(), second.stream()).collect(Collectors.toList());

これは、セクション3.2の配列の場合と同じですが、配列に変換する代わりに、コレクターを使用してリストに変換しました。 コレクターの詳細については、Java8のコレクターガイドにアクセスしてください。

flatMapsは次のように使用することもできます。

List<Object> combined = Stream.of(first, second).flatMap(Collection::stream).collect(Collectors.toList());

まず、Stream.of()を使用しています。これは、1番目と2番目の2つのリストのシーケンシャルストリームを返します。 次に、それをflatMapに渡します。これにより、マッピング関数を適用した後、マップされたストリームのコンテンツが返されます。 この方法については、 Javaでのストリームのマージ論文。

flatMap の詳細については、このBaeldungの記事にアクセスしてください。

4.3. ApacheCommonsのListUtilsを使用する

CollectionUtils.union は、2つのコレクションの結合を実行し、すべての要素を含むコレクションを返します。

List<Object> combined = ListUtils.union(first, second);

この方法については、 Apache Commons CollectionsCollectionUtilsのガイドでも説明されています。 詳細については、セクション4.9に進んでください。 この記事の。

4.4. グアバの使用

Guavaを使用してリストをマージするには、concat()メソッドで構成されるIterableを使用します。すべてのコレクションを連結した後、次に示すように、結合されたListオブジェクトをすばやく取得できます。この例:

Iterable<Object> combinedIterables = Iterables
  .unmodifiableIterable(Iterables.concat(first, second));
List<Object> combined = Lists.newArrayList(combinedIterables);

5. SetをJavaに組み合わせる

5.1. プレーンJavaソリューション

セクション4.1ですでに説明したように、コレクションインターフェイスには、リストおよびのコピーに使用できる組み込みの addAll()メソッドが付属しています。 ]セットも:

Set<Object> combined = new HashSet<>();
combined.addAll(first);
combined.addAll(second);

5.2. Java8ストリームの使用

リストオブジェクトに使用したのと同じ関数をここで適用できます。

Set<Object> combined = Stream
  .concat(first.stream(), second.stream())
  .collect(Collectors.toSet());

リストと比較する場合の唯一の顕著な違いは、 Collectors.toList()を使用する代わりに、 Collectors.toSet()を使用して、提供された2つの要素からすべての要素を累積することです。新しいSetにストリーミングします。

また、リストと同様に、セット flatMaps を使用すると、次のようになります。

Set<Object> combined = Stream.of(first, second)
  .flatMap(Collection::stream)
  .collect(Collectors.toSet());

5.3. ApacheCommonsの使用

ListUtils と同様に、Set要素の結合を行うSetUtilsを操作することもできます。

Set<Object> combined = SetUtils.union(first, second);

5.4. グアバから使用

Guavaライブラリは、Javaで Setsを組み合わせるための簡単なSets.union()メソッドを提供します。

Set<Object> combined = Sets.union(first, second);

6. マップをJavaに組み合わせる

6.1. プレーンJavaソリューション

Map インターフェースを利用できます。このインターフェースは、 Mapオブジェクトの指定された引数からすべてのマッピングをコピーするputAll()メソッドを提供します。呼び出し元のMapオブジェクト:

Map<Object, Object> combined = new HashMap<>();
combined.putAll(first);
combined.putAll(second);

6.2. Java8の使用

Java 8以降、Mapクラスは、キー、値、およびBiFunctionを受け入れるmerge()メソッドで構成されています。これをJava 8 forEach ステートメントで使用して、マージ機能を実現できます。 :

second.forEach((key, value) -> first.merge(key, value, String::concat));

3番目のパラメーター、つまり再マッピング関数は、同じキーと値のペアが両方のソースマップに存在する場合に役立ちます。 この関数は、これらのタイプの値で何をすべきかを指定します。

次のようにflatMapを使用することもできます。

Map<String, String> combined = Stream.of(first, second)
  .map(Map::entrySet)
  .flatMap(Collection::stream)
  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, String::concat));

6.3. ApacheCommonsExecの使用

Apache Commons Exec 簡単なものを提供してくれますマージ(マップまず、地図 2番目) 方法:

Map<String, String> combined = MapUtils.merge(first, second);

6.4. GoogleGuavaを使用する

GoogleのGuavaライブラリが提供するImmutableMapを使用できます。 putAll()メソッドは、指定されたマップのすべてのキーと値を作成されたマップに関連付けます。

Map<String, String> combined = ImmutableMap.<String, String>builder()
  .putAll(first)
  .putAll(second)
  .build();

7. 結論

この記事では、さまざまなタイプのコレクションを組み合わせるためのさまざまなアプローチについて説明しました。 配列リストセット、およびマップをマージしました。

いつものように、適切な単体テストを含む完全なコードスニペットは、GitHubでにあります。