1前書き

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

Javaと、Guava、Apacheなどの外部フレームワークを使用したさまざまなアプローチを検討します。コレクションの概要については、https://www.baeldung.com/java-collectionsをご覧ください。


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>26.0-jre</version>
</dependency>

最新バージョンはMaven Centralのhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22commons-collections4%22[Commons]、https://search.mavenにあります。 org/classic/#search%7Cga%7C1%7Ca%3A%22commons-exec%22[Commons-exec]およびhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22com .google.guava%22%20AND%20a%3A%22guava%22[グアバ]


3 Java

で配列を組み合わせる


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

  • Javaには組み込みの

    httpsが付属しています。 Object、%20int、%20int)[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);

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

これはネイティブのJavaソリューションなので、外部ライブラリを必要としません。


3.2. Java 8

Stream

API

の使用

ストリームは、さまざまな種類のコレクションを反復処理するための効果的な方法を提供します。ストリームを始めるには、https://www.baeldung.com/java-8-streams[Java 8 Stream API Tutorial]にアクセスしてください。


Stream

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

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

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

この方法については、セクション4.2で見直します。 5.2。

Lists



Sets

で同じ方法を使用する方法を確認します。


3.3. Apache Commons

から

ArrayUtils

を使用する

Apache commons libraryはhttps://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/ArrayUtils.html#addAll-T:AT…​-を私たちに提供しています。


ArrayUtils


パッケージの[

addAll()

]メソッド。

destinationとsourceの配列をパラメータとして指定できます。このメソッドは結合された配列を返します。

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

この方法については、https://www.baeldung.com/array-processing-commons-lang[Apache Commons Lang 3による配列処理]の記事でも詳しく説明しています。


3.4. Guava

を使う

Guavaは


concat()


同じ目的のメソッド:

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

異なるデータ型で使用することができ、結合された配列を返すためにクラスリテラルと共に2つのソース配列を受け入れます。


4 Javaで

List

を組み合わせる


4.1.

Collection

ネイティブ

addAll()の使用方法

メソッド



Collection


インタフェース自体がhttps://docs.oracle.com/javase/7/docsを提供しています。/api/java/util/Collection.html#addAll(java.util.Collection)[

addAll()

]メソッド。指定されたコレクション内のすべての要素を呼び出し元のオブジェクトに追加します。これについてはhttps://www.baeldung.com/java-combine-multiple-collections[このBaeldungの記事:]でも詳しく説明されています。

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

このメソッドはCollectionsフレームワークの最も親のインターフェース、すなわち

Collection

インターフェースで提供されているので、すべての

__List





Set

__に適用できます。


4.2. Java 8

を使用する

次のように

Stream



Collectors

を使用して

Lists

を組み合わせることができます。

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

これはセクション3.2の

Arrays

の場合と同じですが、配列に変換する代わりに、コレクターを使用してそれをリストに変換しました。

Collectors

の詳細については、https://www.baeldung.com/java-8-collectors[Java 8のCollectorsの手引き]を参照してください。

このように

flatMaps

を使うこともできます。

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

  • まず、https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#of-T…​-[

    Stream.of()

    ]を使用しています。これは、

    first



    second

    の2つのリストの連続したストリームを返します。

それから、それを

flatMap

に渡し、マッピング関数を適用した後にマッピングされたストリームの内容を返します。記事。


flatMap

の詳細については、https://www.baeldung.com/java-difference-map-and-flatmap[このBaeldungの記事]をご覧ください。


4.3. Apache Commons

から

ListUtils

を使用する


__CollectionUtils.union

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

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

この方法はhttps://www.baeldung.com/apache-commons-collection-utils[Apache Commons Collectionsのガイド

CollectionUtils

]でも説明されています。詳細については、セクション4.9に進んでください。この記事の


4.4. Guava

を使う

  • Guavaを使用して

    List

    をマージするには、

    concat()

    メソッドで構成される

    Iterable

    を使用します。** すべてのコレクションを連結した後、次の例に示すように、結合された

    List

    オブジェクトをすぐに取得できます。

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


5 Javaで

Set

を組み合わせる


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

セクション4.1ですでに説明したように、https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html[Collection]インタフェースには、https://commonsが組み込まれています。 .apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/ArrayUtils.html#addAll-T:AT …​-[

addAll()

]メソッド

Lists



Sets

もコピーする:

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


5.2. Java 8 Streamsの使い方


__List

__objectsに使用したのと同じ関数をここでも適用できます。

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

  • ここでリストと比較したときの唯一の注目すべき違いは、https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toList–[

    Collectors.toListを使用する代わりに()

    ]、https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toSet–[

    Collectors.toSet()

    ]を使用して累計しています提供された2つのストリームからのすべての要素を新しい

    Set

    。** にします。


Lists

と同様に、

Sets

で____flatMapsを使用すると、次のようになります。

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


5.3. Apache Commonsを使う


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で

Map

を組み合わせる


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


Map

オブジェクトの提供された引数から呼び出し側の

Map

オブジェクトにすべてのマッピングをコピーする

putAll()

メソッドを提供する

Map

インターフェースを使用することができます。

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


6.2. Java 8

を使用する

  • Java 8以降、

    Map

    クラスは、キー、値、およびhttps://docs.oracle.com/javase/8/docs/api/java/util/function/BiFunctionを受け入れる

    merge()

    メソッドで構成されています。 html[BiFunction]。** マージ機能を実現するために、これを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. Apache Commons Exec

を使用する


Apache Commons Exec

は、わかりやすいhttps://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/を提供します。 exec/util/MapUtils.html#merge(java.util.Map、%20java.util.Map)[

merge(Map <K、V>、Map <K、V> second)

]メソッド:

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


6.4. Google Guava

を使用する

GoogleのGuavaライブラリで提供されている


_https://google.github.io/guava/releases/21.0/api/docs/com/google/common/collect/ImmmableMap.html[ImmutableMap]を使用できます。それは


putAll()

_

method与えられたマップのすべてのキーと値を構築マップに関連付けます。

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


7. 結論

この記事では、さまざまなタイプの

Collections

を組み合わせるためのさまざまなアプローチを取りました。

arrays



Lists



Sets

、および

Maps

をマージしました。

いつものように、完全なコードスニペットとその適切な単体テストは、
見つけられた

https://github.com/eugenp/tutorials/tree/master/core-java-collections

[over
GitHubで。