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 .