1. Обзор
В этом коротком уроке мы покажем, как преобразовать массив примитивов в Список объектов соответствующего типа . Как правило, мы можем попытаться использовать autoboxing в Java. Однако, как мы увидим в следующем разделе, наша интуиция о том, как работает автобокс, часто может быть ошибочной.
2. Проблема
Давайте начнем с определения проблемы. У нас есть массив примитивов ( int[] ), и мы хотим преобразовать этот массив в List ( List ). Интуитивная первая попытка может быть:
int[] input = new int[]{1,2,3,4}; Listoutput = Arrays.asList(input);
К сожалению, это не будет компилироваться из-за несовместимости типов . Мы могли бы ожидать, что автобокс будет работать с массивами примитивов. Однако это инстинктивное убеждение неверно.
Автобокс происходит только для одного элемента (например, из int в Integer ). Не существует автоматического преобразования массива примитивных типов в массив их стандартных ссылочных типов (например, из int[] в Integer[] ).
Давайте начнем реализовывать несколько решений этой проблемы.
3. Итерация
Поскольку автобокс работает с отдельными примитивными элементами, простое решение состоит в том, чтобы просто перебирать элементы массива и добавлять их в Список один за другим :
int[] input = new int[]{1,2,3,4}; Listoutput = new ArrayList (); for (int value : input) { output.add(value); }
Мы решили эту проблему, но решение довольно многословно. Это подводит нас к следующей реализации.
4. Потоки
Начиная с Java 8, мы можем использовать Stream API . Мы можем предоставить однострочное решение, используя Поток :
int[] input = new int[]{1,2,3,4}; Listoutput = Arrays.stream(input).boxed().collect(Collectors.toList());
В качестве альтернативы мы могли бы использовать IntStream :
int[] input = new int[]{1,2,3,4}; Listoutput = IntStream.of(input).boxed().collect(Collectors.toList());
Это, конечно, выглядит намного приятнее. Далее мы рассмотрим несколько внешних библиотек.
5. Гуава
Библиотека Guava предоставляет оболочку вокруг этой проблемы . Давайте начнем с добавления зависимости Maven :
com.google.guava guava 29.0-jre bundle
Мы можем использовать Ints.asList () с аналогичными служебными классами для других примитивных типов:
int[] input = new int[]{1,2,3,4}; Listoutput = Ints.asList(input);
6. Apache Commons
Другая библиотека-это Apache Commons Lang . Опять же, давайте добавим зависимость Maven для этой библиотеки:
org.apache.commons commons-lang3 3.11
Точнее, мы используем класс ArrayUtils :
int[] input = new int[]{1,2,3,4}; Integer[] outputBoxed = ArrayUtils.toObject(input); Listoutput = Arrays.asList(outputBoxed);
7. Заключение
Теперь у нас есть несколько вариантов в нашем наборе инструментов для преобразования массива примитивов в Список . Как мы уже видели, автобокс происходит только для отдельных элементов. В этом уроке мы рассмотрели несколько решений для применения преобразования .
Как всегда, полный исходный код статьи доступен на GitHub .