Очень простой эксперимент:
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
.
Мне показалось удобным использовать 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:, обновленный, чтобы обеспечить полное преобразование в список, как подсказывают комментарии и другие исправления.
. Если вы хотите семантику, аналогичную Arrays.asList
, вам нужно написать (или использовать чужую) реализацию клиента List
(возможно, через AbstractList
. Она должна иметь почти такую же реализацию, что и Arrays.asList
, только значения box и unbox.
Немного более многословно, но это работает:
List<Long> list = new ArrayList<Long>();
for (long value : input) {
list.add(value);
}
В вашем примере кажется, что Arrays.asList () интерпретировать ввод как список длинных [] массивов вместо списка длинных. Немного удивительно, конечно. В этом случае автобокс работает не так, как вы хотите.
Нет, нет автоматического преобразования из массива примитивного типа в массив их ссылочных типов в штучной упаковке. Вы можете сделать только
long[] input = someAPI.getSomeLongs();
List<Long> lst = new ArrayList<Long>();
for(long l : input) lst.add(l);
hallidave и jpalecek имеют правильную идею - перебирают массив - но они не используйте функцию, предоставляемую ArrayList
: поскольку размер списка известен , в этом случае его следует указывать при создании ArrayList
.
List<Long> list = new ArrayList<Long>(input.length);
for (long n : input)
list.add(n);
Таким образом, ненужные массивы не создаются только для удаления ArrayList
, потому что они оказываются слишком короткими, и пустые «слоты» не теряются, потому что ArrayList
] переоценил свои требования к площади. Конечно, если вы продолжите добавлять элементы в список, потребуется новый вспомогательный массив.
Вы можете использовать ТРАНСПОРТ :
Transmorph transmorph = new Transmorph(new DefaultConverters());
List<Long> = transmorph.convert(new long[] {1,2,3,4}, new TypeReference<List<Long>>() {});
Также работает, если источник является массивом INTS, например.
Я пишу небольшую библиотеку для этих проблем:
long[] input = someAPI.getSomeLongs();
List<Long> = $(input).toList();
в том случае, если вы заботитесь с этим, проверьте его здесь .
import java.util.Arrays;
import org.apache.commons.lang.ArrayUtils;
List<Long> longs = Arrays.asList(ArrayUtils.toObject(new long[] {1,2,3,4}));