问题描述
|
是否有任何实用方法将数值类型列表转换为原始类型数组?
换句话说,我正在寻找比这更好的解决方案。
private long[] toArray(List<Long> values) {
long[] result = new long[values.size()];
int i = 0;
for (Long l : values)
result[i++] = l;
return result;
}
解决方法
从Java 8开始,您可以执行以下操作:
long[] result = values.stream().mapToLong(l -> l).toArray();
这里发生了什么事?
我们将List<Long>
转换为Stream<Long>
。
我们叫ѭ4to得到to5 a
mapToLong
的参数是a7ѭ,其结果类型为long
。
因为Java会自动将ѭ9取消装箱到ѭ8,所以将ѭ11编写为lambda表达式是可行的。 Long
在那里转换为to8ѭ。我们也可以更明确一些,使用Long::longValue
代替。
我们称toArray
,它返回returns16ѭ
, Google Guava:Longs.toArray(Collection)
long[] result = Longs.toArray(values);
, 使用来自Apache Commons的ArrayUtils.toPrimitive(Long[] array)
。
Long[] l = values.toArray(new Long[values.size()]);
long[] l = ArrayUtils.toPrimitive(l);
, 我不记得有什么本地方法可以做到这一点,但是创建一个self-;)是怎么回事。
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();
}
}
}
}