Работа с массивами примитивных типов
В предыдущих шагах мы работали с массивами ссылочных типов (String). Однако массивы Java также могут содержать примитивные типы, такие как int, double и т. д. Преобразование массивов примитивных типов в списки требует дополнительных шагов, поскольку обобщения Java работают только с ссылочными типами.
Давайте создадим новый пример, чтобы продемонстрировать этот процесс.
Создание нового Java-файла
-
Создайте новый Java-файл с именем PrimitiveArrayToList.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]
Понимание преобразования массивов примитивных типов
При работе с массивами примитивных типов необходимо учитывать два ключевых момента:
-
Autoboxing (Автоупаковка): Java автоматически преобразует примитивные значения в объекты их классов-оберток при добавлении в коллекции. Например, int преобразуется в Integer.
-
Boxing Methods for Streams (Методы упаковки для потоков): При использовании потоков с массивами примитивных типов необходимо вызвать метод .boxed(), чтобы преобразовать потоки примитивных типов в потоки объектов.
Процесс преобразования создает совершенно новые списки, которые не зависят от исходных массивов. Это означает:
- Изменение списка не повлияет на исходный массив.
- Списки полностью изменяемы (вы можете добавлять, удалять или изменять элементы).
- Каждый элемент в списке является новым объектом (оберткой), который содержит значение из массива.
Эта независимость особенно полезна, когда вам нужно манипулировать данными, не рискуя внести изменения в исходный массив.