プリミティブ配列の操作
前のステップでは、参照型(String)の配列を扱いました。しかし、Java の配列には、int、doubleなどのプリミティブ型も格納できます。プリミティブ配列をリストに変換するには、Java のジェネリクスが参照型でのみ機能するため、追加の手順が必要です。
このプロセスを実演するために、新しい例を作成しましょう。
新しい Java ファイルの作成
-
同じディレクトリに、PrimitiveArrayToList.javaという新しい Java ファイルを作成します。
WebIDE から、project/src/main/javaに移動し、右クリックして「New File」を選択します。ファイル名をPrimitiveArrayToList.javaとします。
-
ファイルに以下のコードを追加します。
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class PrimitiveArrayToList {
public static void main(String[] args) {
System.out.println("Converting Primitive Arrays to Lists");
System.out.println("===================================");
// Create a primitive int array
int[] numbersArray = {10, 20, 30, 40, 50};
System.out.println("Original primitive array: " + Arrays.toString(numbersArray));
// Method 1: Manual conversion
System.out.println("\nMethod 1: Manual conversion");
List<Integer> numbersList1 = new ArrayList<>();
for (int number : numbersArray) {
numbersList1.add(number); // Autoboxing converts int to Integer
}
System.out.println("List after manual conversion: " + numbersList1);
// Method 2: Using Java 8 Streams
System.out.println("\nMethod 2: Using Java 8 Streams");
List<Integer> numbersList2 = Arrays.stream(numbersArray)
.boxed() // Converts IntStream to Stream<Integer>
.collect(Collectors.toList());
System.out.println("List after stream conversion: " + numbersList2);
// Modify the lists to demonstrate independence from the array
System.out.println("\nModifying the lists:");
numbersList1.add(60);
numbersList1.set(0, 15);
numbersList2.add(70);
numbersList2.remove(0);
System.out.println("List 1 after modifications: " + numbersList1);
System.out.println("List 2 after modifications: " + numbersList2);
System.out.println("Original array after List modifications: " + Arrays.toString(numbersArray));
// Create and convert other primitive type arrays
System.out.println("\nOther primitive type examples:");
double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5};
List<Double> doubleList = Arrays.stream(doubleArray)
.boxed()
.collect(Collectors.toList());
System.out.println("Double array: " + Arrays.toString(doubleArray));
System.out.println("Double list: " + doubleList);
boolean[] boolArray = {true, false, true, true, false};
List<Boolean> boolList = new ArrayList<>();
for (boolean value : boolArray) {
boolList.add(value);
}
System.out.println("Boolean array: " + Arrays.toString(boolArray));
System.out.println("Boolean list: " + boolList);
}
}
- プログラムをコンパイルして実行します。
cd ~/project
javac src/main/java/PrimitiveArrayToList.java
java -cp src/main/java PrimitiveArrayToList
次のような出力が表示されるはずです。
Converting Primitive Arrays to Lists
===================================
Original primitive array: [10, 20, 30, 40, 50]
Method 1: Manual conversion
List after manual conversion: [10, 20, 30, 40, 50]
Method 2: Using Java 8 Streams
List after stream conversion: [10, 20, 30, 40, 50]
Modifying the lists:
List 1 after modifications: [15, 20, 30, 40, 50, 60]
List 2 after modifications: [20, 30, 40, 50, 70]
Original array after List modifications: [10, 20, 30, 40, 50]
Other primitive type examples:
Double array: [1.1, 2.2, 3.3, 4.4, 5.5]
Double list: [1.1, 2.2, 3.3, 4.4, 5.5]
Boolean array: [true, false, true, true, false]
Boolean list: [true, false, true, true, false]
プリミティブ配列の変換の理解
プリミティブ配列を扱う際には、2 つの重要な考慮事項があります。
-
オートボクシング(Autoboxing): Java は、コレクションに追加する際に、プリミティブ値をラッパークラスオブジェクトに自動的に変換します。たとえば、intはIntegerに変換されます。
-
ストリームのボクシングメソッド(Boxing Methods for Streams): プリミティブ配列でストリームを使用する場合は、プリミティブストリームをオブジェクトストリームに変換するために、.boxed()メソッドを呼び出す必要があります。
変換プロセスは、元の配列から完全に独立した新しいリストを作成します。これは、次のことを意味します。
- リストを変更しても、元の配列には影響しません。
- リストは完全に可変です(要素を追加、削除、または変更できます)。
- リスト内の各要素は、配列からの値を含む新しいオブジェクト(ラッパー)です。
この独立性は、元の配列への変更をリスクにさらすことなく、データを操作する必要がある場合に特に役立ちます。