(Un) бокс массивов примитивов в Java - PullRequest
7 голосов
/ 20 мая 2011

в мире Android Java, существует ли простой (в идеале один вызов) способ преобразования массива int в ArrayList<Integer> и обратно?Вызов toArray() для ArrayList возвращает массив Integer - не совсем то, что я хочу.

Я легко могу сделать это вручную с помощью цикла (уже сделал, на самом деле).Мне интересно, поддерживает ли библиотека / язык то же самое.

РЕДАКТИРОВАТЬ: спасибо всем, я уже написал свой собственный боксер и распаковщик.Я просто удивлен тем, что дизайнеры языка / RTL сами не думали об этом, особенно из-за того, что примитивные типы по дизайну не подходят для коллекций.

Ответы [ 5 ]

11 голосов
/ 20 мая 2011

Использование Гуава ( Ints.asList (int ...) и Ints.toArray (Collection ) ):

int[] intArray = ...
List<Integer> intArrayAsList = Ints.asList(intArray);
int[] intArray2 = Ints.toArray(intArrayAsList);

Обратите внимание, что подобно Arrays.asList, Ints.asList возвращает список, представляющий собой представление данного массива. Вы не можете добавить или удалить его, но вы можете set значение по определенному индексу. Вы также можете скопировать его в новый ArrayList, если хотите:

List<Integer> arrayList = Lists.newArrayList(Ints.asList(intArray));

Гуава имеет одинаковые методы для всех примитивных типов.

4 голосов
/ 20 мая 2011

Если вы создадите служебный метод, который будет преобразовывать один вызов. Возможно, в вашем случае это было бы лучше, чем добавление целой библиотеки (из которой вы могли бы просто использовать одну функцию), хотя это должно быть слишком большим бременем для вашего приложения.

Вот исходный код для ответа h3xStream (рад, что он использует лицензию Apache);)

3 голосов
/ 17 января 2018

Упаковка и распаковка (без специальных библиотек):

// Necessary Imports:
import java.util.*;
import java.util.stream.*;

// Integers:
int[] primitives = {1, 2, 3};
Integer[] boxed = Arrays.stream(primitives).boxed().toArray(Integer[]::new);
int[] unboxed = Arrays.stream(boxed).mapToInt(Integer::intValue).toArray();

// Doubles:
double[] primitives = {1.0, 2.0, 3.0};
Double[] boxed = Arrays.stream(primitives).boxed().toArray(Double[]::new);
double[] unboxed = Arrays.stream(boxed).mapToDouble(Double::doubleValue).toArray();

Обратите внимание, что для этого требуется Java 8 ( Потоковая документация ).

Для тех, кто не знает, что означает ::, он используется для создания справочника по методам .

1 голос
/ 21 октября 2016

Мне удалось найти решение в Java 8 :

import java.util.Arrays;
...
double[] columnsValue = {...};
Double[] values = Arrays.stream(columnsValue).boxed().toArray(Double[]::new);

Я не могу объяснить, что именно означает Double[]::new, потому что я не знал эту функцию Java 8 раньше (на самом деле, IntelliJ IDEA написал это для меня) , но похоже, что он делает new Double(double) для каждого элемента массива.

Обратите внимание : я проверял это только на рабочем столе, я не знаю, работает ли он в Android.

1 голос
/ 20 мая 2011

Common.Lang от Apache имеет класс Utility, который делает это: ArrayUtils

...