プリミティブの配列をリストに変換する
1. 概要
この短いチュートリアルでは、プリミティブの配列を対応するタイプのオブジェクトのリストに変換する方法を示します。 通常、Javaではautoboxingを使用しようとします。 ただし、次のセクションで説明するように、オートボクシングがどのように機能するかについての直感は、多くの場合誤っている可能性があります。
2. 問題
問題の定義から始めましょう。 プリミティブの配列があります (( int [] )、 その配列をリストに変換したい (( リスト
int[] input = new int[]{1,2,3,4};
List<Integer> output = Arrays.asList(input);
残念ながら、このは、タイプの非互換性のためにコンパイルされません。 オートボクシングがプリミティブの配列で機能することを期待するかもしれません。 しかし、この本能的な信念は真実ではありません。
オートボクシングは単一の要素に対してのみ発生します(たとえば、intからIntegerまで)。 プリミティブ型の配列からボックス化された参照型の配列への自動変換はありません(たとえば、 int[]からInteger[] )。
この問題に対するいくつかの解決策の実装を始めましょう。
3. 反復
オートボクシングは単一のプリミティブ要素で機能するため、簡単な解決策は、配列の要素を繰り返し処理し、それらを1つずつリストに追加することです。
int[] input = new int[]{1,2,3,4};
List<Integer> output = new ArrayList<Integer>();
for (int value : input) {
output.add(value);
}
問題は解決しましたが、解決策は非常に冗長です。 これにより、次の実装に進みます。
4. ストリーム
Java 8以降、StreamAPIを使用できます。 Streamを使用して1行のソリューションを提供できます。
int[] input = new int[]{1,2,3,4};
List<Integer> output = Arrays.stream(input).boxed().collect(Collectors.toList());
または、IntStreamを使用することもできます。
int[] input = new int[]{1,2,3,4};
List<Integer> output = IntStream.of(input).boxed().collect(Collectors.toList());
これは確かにずっと良く見えます。 次に、いくつかの外部ライブラリを見ていきます。
5. グアバ
Guavaライブラリは、この問題のラッパーを提供します。 Maven依存関係を追加することから始めましょう。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
<type>bundle</type>
</dependency>
Ints.asList()を、他のプリミティブタイプの同様のユーティリティクラスで使用できます。
int[] input = new int[]{1,2,3,4};
List<Integer> output = Ints.asList(input);
6. Apache Commons
もう1つのライブラリは、 Apache CommonsLangです。 ここでも、このライブラリのMaven依存関係を追加しましょう。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
より正確には、ArrayUtilsクラスを使用します。
int[] input = new int[]{1,2,3,4};
Integer[] outputBoxed = ArrayUtils.toObject(input);
List<Integer> output = Arrays.asList(outputBoxed);
7. 結論
ツールボックスに、プリミティブの配列をListに変換するためのオプションがいくつかあります。
いつものように、記事の完全なソースコードは、GitHubでから入手できます。