Преобразование массива примитивных лонгов в список лонгов



это может быть немного простой, headdesk своего рода вопрос, но моя первая попытка на удивление полностью не сработала. Я хотел взять массив примитивных лонгов и превратить его в список, который я попытался сделать следующим образом:



long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!


Как правильно это сделать?

675   14  

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

    Ничего не найдено.