Каков наилучший способ преобразования массива List <Long> в long [] в java?
Есть ли какой-либо метод утилиты для преобразования списка числовых типов в массив примитивного типа?
Другими словами, я ищу лучшее решение, чем это.
private long[] toArray(List<Long> values) {
long[] result = new long[values.size()];
int i = 0;
for (Long l : values)
result[i++] = l;
return result;
}
Ответы
Ответ 1
Начиная с Java 8, вы можете сделать следующее:
long[] result = values.stream().mapToLong(l -> l).toArray();
Что здесь происходит?
- Преобразуем
List<Long>
в Stream<Long>
.
- Мы вызываем
mapToLong
, чтобы получить LongStream
- Аргумент
mapToLong
- это ToLongFunction
, который имеет long
как тип результата.
- Так как Java автоматически распаковывает
long
в long
, записывая l -> l
в качестве выражения лямбда. long
преобразуется в long
. Мы также могли бы быть более явными и вместо этого использовать Long::longValue
.
- Мы называем
toArray
, который возвращает long[]
Ответ 2
Google Guava: Longs.toArray(Collection)
long[] result = Longs.toArray(values);
Ответ 3
Используйте ArrayUtils.toPrimitive(Long[] array)
из Apache Commons.
Long[] l = values.toArray(new Long[values.size()]);
long[] l = ArrayUtils.toPrimitive(l);
Ответ 4
Я не помню о каком-то собственном методе, который будет делать это, но что не так с созданием self one; -).
public class YasinUtilities {
public static long[] toArray(Iterator<Long) values) { //Better choice would be Enumerator but easier is this way.
if(value == null) {
//return null or throw exception
}
long[] result = new long[values.size()];
Long current = null;
int i = 0;
while(values.hasNext()) {
current = values.next();
if(current == null) {
result[i++] = 0L; //or -1;
} else {
result[i++] = current.longValue();
}
}
}
}