Перейти к основному содержимому

Преобразование массива примитивов в список

· 3 мин. чтения

1. Обзор

В этом коротком уроке мы покажем, как преобразовать массив примитивов в список объектов соответствующего типа . Как правило, мы можем попытаться использовать автоупаковку в Java. Однако, как мы увидим в следующем разделе, наша интуиция о том, как работает автобокс, часто может быть ошибочной.

2. Проблема

Начнем с определения проблемы. У нас есть массив примитивов ( int[] ), и мы хотим преобразовать этот массив в список ( List<Integer> ). Интуитивной первой попыткой может быть:

int[] input = new int[]{1,2,3,4};
List<Integer> output = Arrays.asList(input);

К сожалению, это не скомпилируется из-за несовместимости типов . Мы могли бы ожидать, что автоупаковка будет работать с массивами примитивов. Однако это инстинктивное убеждение неверно.

Автоупаковка происходит только для одного элемента (например, от int до Integer ). Нет автоматического преобразования массива примитивных типов в массив их упакованных ссылочных типов (например, из int[] в Integer[] ).

Давайте начнем реализовывать несколько решений этой проблемы.

3. Итерация

Поскольку автоупаковка работает с отдельными примитивными элементами, простое решение состоит в том, чтобы просто перебирать элементы массива и добавлять их в список один за другим :

int[] input = new int[]{1,2,3,4};
List<Integer> output = new ArrayList<Integer>();
for (int value : input) {
output.add(value);
}

Мы решили проблему, но решение довольно многословно. Это подводит нас к следующей реализации.

4. Потоки

Начиная с Java 8 мы можем использовать Stream API . Мы можем предоставить однострочное решение, используя Stream :

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 Lang . Опять же, давайте добавим зависимость 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. Заключение

Теперь у нас есть несколько вариантов в нашем наборе инструментов для преобразования массива примитивов в список . Как мы видели, автоупаковка происходит только для отдельных элементов. В этом руководстве мы рассмотрели несколько решений для применения преобразования .

Как всегда, полный исходный код статьи доступен на GitHub .