Javaでさまざまな種類のコレクションを組み合わせる

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で。