Преобразуйте массив примитивного longs в Список Longs

Очень простой эксперимент:

case class A(s: String) { def ++:(a: A) = A(s"(${a.s} + ${s})") }
A("x") ++: A("y") ++: A("z")

дает:

A((x + (y + z)))

, так что это x + (y + z), а не (x + y) + z. Таким образом, ++: является правоассоциативным, как рекламируется.

Обратите внимание, что это ${a.s} + ${s}, а не ${s} + ${a.s}. В случае Queue это, вероятно, аналогично, что-то вроде:

def ++:(left: Queue[A]): Queue[A] = left ++ this

, поэтому порядок элементов появляется «как и должно быть», когда вы пишете q0 ++: q1, который десугарсирует в q1.++:(q0), а затем расширяется в q0 ++ q1.

132
задан Eran Medan 31 August 2015 в 06:04
поделиться

8 ответов

Мне показалось удобным использовать apache commons lang ArrayUtils (JavaDoc, Maven dependence)

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:, обновленный, чтобы обеспечить полное преобразование в список, как подсказывают комментарии и другие исправления.

.
112
ответ дан 24 November 2019 в 00:07
поделиться

Если вы хотите семантику, аналогичную Arrays.asList , вам нужно написать (или использовать чужую) реализацию клиента List (возможно, через AbstractList . Она должна иметь почти такую ​​же реализацию, что и Arrays.asList , только значения box и unbox.

2
ответ дан 24 November 2019 в 00:07
поделиться

Немного более многословно, но это работает:

    List<Long> list = new ArrayList<Long>();
    for (long value : input) {
        list.add(value);
    }

В вашем примере кажется, что Arrays.asList () интерпретировать ввод как список длинных [] массивов вместо списка длинных. Немного удивительно, конечно. В этом случае автобокс работает не так, как вы хотите.

19
ответ дан 24 November 2019 в 00:07
поделиться

Нет, нет автоматического преобразования из массива примитивного типа в массив их ссылочных типов в штучной упаковке. Вы можете сделать только

long[] input = someAPI.getSomeLongs();
List<Long> lst = new ArrayList<Long>();

for(long l : input) lst.add(l);
7
ответ дан 24 November 2019 в 00:07
поделиться

hallidave и jpalecek имеют правильную идею - перебирают массив - но они не используйте функцию, предоставляемую ArrayList : поскольку размер списка известен , в этом случае его следует указывать при создании ArrayList .

List<Long> list = new ArrayList<Long>(input.length);
for (long n : input)
  list.add(n);

Таким образом, ненужные массивы не создаются только для удаления ArrayList , потому что они оказываются слишком короткими, и пустые «слоты» не теряются, потому что ArrayList ] переоценил свои требования к площади. Конечно, если вы продолжите добавлять элементы в список, потребуется новый вспомогательный массив.

35
ответ дан 24 November 2019 в 00:07
поделиться

Вы можете использовать ТРАНСПОРТ :

Transmorph transmorph = new Transmorph(new DefaultConverters());
List<Long> = transmorph.convert(new long[] {1,2,3,4}, new TypeReference<List<Long>>() {});

Также работает, если источник является массивом INTS, например.

2
ответ дан 24 November 2019 в 00:07
поделиться

Я пишу небольшую библиотеку для этих проблем:

long[] input = someAPI.getSomeLongs();
List<Long> = $(input).toList();

в том случае, если вы заботитесь с этим, проверьте его здесь .

6
ответ дан 24 November 2019 в 00:07
поделиться
import java.util.Arrays;
import org.apache.commons.lang.ArrayUtils;

List<Long> longs = Arrays.asList(ArrayUtils.toObject(new long[] {1,2,3,4}));
37
ответ дан 24 November 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: