Преобразование массива примитивных лонгов в список лонгов
это может быть немного простой, headdesk своего рода вопрос, но моя первая попытка на удивление полностью не сработала. Я хотел взять массив примитивных лонгов и превратить его в список, который я попытался сделать следующим образом:
long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!
Как правильно это сделать?
14 ответов:
Я нашел это удобным сделать с помощью apache commons lang ArrayUtils (документация,зависимостей Maven)
import org.apache.commons.lang3.ArrayUtils; ... long[] input = someAPI.getSomeLongs(); Long[] inputBoxed = ArrayUtils.toObject(input); List<Long> inputAsList = Arrays.asList(inputBoxed);Он также имеет обратный API
long[] backToPrimitive = ArrayUtils.toPrimitive(objectArray);EDIT: обновление, чтобы обеспечить полное преобразование в список, как полагают замечаний и исправлений.
начиная с Java 8 Теперь вы можете использовать потоки для этого:
long[] arr = {1,2,3,4}; List<Long> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; List<Long> longs = Arrays.asList(ArrayUtils.toObject(new long[] {1,2,3,4}));
hallidave и jpalecek есть правильная идея-итерация по массиву-но они не используют функцию, предоставленную
ArrayList: С размер списка известен в этом случае, вы должны указать его при созданииArrayList.List<Long> list = new ArrayList<Long>(input.length); for (long n : input) list.add(n);таким образом, никакие ненужные массивы не создаются только для того, чтобы быть отброшенными
ArrayListпотому что они оказываются слишком короткими, и никакие пустые "слоты" не тратятся впустую, потому чтоArrayListзавышены его требования к площади. Конечно, если вы продолжите добавлять элементы в список, потребуется новый резервный массив.
Как еще одна возможность, гуавы библиотека предоставляет этого как
Longs.asList(), с аналогичными служебными классами для других примитивных типов.import com.google.common.primitives.Longs; long[] input = someAPI.getSomeLongs(); List<Long> output = Longs.asList(input);
немного более подробно, но это работает:
List<Long> list = new ArrayList<Long>(); for (long value : input) { list.add(value); }в вашем примере это выглядит как массивы.asList () интерпретирует входные данные как список длинных массивов[] вместо списка длинных массивов. Немного удивительно, конечно. Автобоксинг просто не работает так, как вы хотите, чтобы в этом случае.
нет, нет автоматического преобразования из массива примитивного типа в массив их коробочных ссылочных типов. Вы можете только сделать
long[] input = someAPI.getSomeLongs(); List<Long> lst = new ArrayList<Long>(); for(long l : input) lst.add(l);
Я пишу небольшую библиотеку для этих проблем:
long[] input = someAPI.getSomeLongs(); List<Long> = $(input).toList();в случае, если вы заботитесь проверить его здесь.
другой способ с Java 8.
long[] input = someAPI.getSomeLongs(); LongStream.of(input).boxed().collect(Collectors.toList()));
объединяя ответы Павла и Тома, мы получаем это
@SuppressWarnings("unchecked") public static <T> List<T> asList(final Object array) { if (!array.getClass().isArray()) throw new IllegalArgumentException("Not an array"); return new AbstractList<T>() { @Override public T get(int index) { return (T) Array.get(array, index); } @Override public int size() { return Array.getLength(array); } }; }
другое путь С Java 8.
final long[] a = new long[]{1L, 2L}; final List<Long> l = Arrays.stream(a).boxed().collect(Collectors.toList());
если вы хотите, чтобы подобная семантика
Arrays.asListтогда вам нужно будет написать (или использовать чужую) реализацию клиентаList(вероятно, черезAbstractList. Он должен иметь почти такую же реализацию, какArrays.asList, только значения box и unbox.
можно использовать найти все темы царей:
Transmorph transmorph = new Transmorph(new DefaultConverters()); List<Long> = transmorph.convert(new long[] {1,2,3,4}, new TypeReference<List<Long>>() {});Он также работает, если источником является массив ints, например.
Я знаю, что этот вопрос достаточно стар, но... вы также можете написать свой собственный метод преобразования:
@SuppressWarnings("unchecked") public static <T> List<T> toList(Object... items) { List<T> list = new ArrayList<T>(); if (items.length == 1 && items[0].getClass().isArray()) { int length = Array.getLength(items[0]); for (int i = 0; i < length; i++) { Object element = Array.get(items[0], i); T item = (T)element; list.add(item); } } else { for (Object i : items) { T item = (T)i; list.add(item); } } return list; }после включения его с помощью статического импорта, возможные использования могут быть:
long[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; List<Long> list = toList(array);или
List<Long> list = toList(1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l, 9l);
Comments