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();
-
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#concat-java.util.stream.Stream-java.util.stream.Stream-
[Stream。最初のストリームの要素の後に2番目のストリームの要素が続く連結ストリームを作成します。その後、
toArray()
__method。** を使用して配列に変換されます。
ストリームを作成するプロセスは、さまざまな種類のコレクションで同じです。ただし、さまざまな方法でそれを収集して、そこからさまざまなデータ構造を取得することができます。
この方法については、セクション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で。