我想将像long[] l1 = { 1, 2, 3, 4 };
这样的原始长数组转换为String。此String应具有这些值中的每一个,以,
作为分隔符分隔。
我想通过使用Java 8的流来实现这一目标。我已经将其用于Long[]
数组,但出于某种原因,我无法使其适用于原始long[]
。
public static void main(String[] args) {
long[] l1 = { 1, 2, 3, 4 };
Long[] l2 = new Long[4];
l2[0] = new Long(1);
l2[1] = new Long(2);
l2[2] = new Long(3);
l2[3] = new Long(4);
System.out.println(longToString(l2));
}
public static String longToString(Long... l) {
String[] x = Arrays.stream(l).map(String::valueOf).toArray(String[]::new);
String y = Arrays.stream(x).collect(Collectors.joining(","));
return y;
}
如何为longToString(long... l)
而不是longToString(Long... l)
开展此工作?
另外:我是否设法找到转换它的最佳方式,还是可以进一步简化?我对Java 8的流功能很陌生。
答案 0 :(得分:6)
使原始数组工作的一种方法是:
Arrays.stream(long[])
正如this answer中所述,LongStream
创建了Stream<Long>
,而不是Stream<String>
,因此您需要使用mapToObj()
方法,这将产生String.valueOf()
在这种情况下。
您可以使用Long.toString()
代替String.valueOf
,使Tagir在评论中提及,使此版本更加紧凑。因为String.valueOf
因许多不同的类型而被重载,所以您不必将对象强制转换为Long,只需使用方法引用Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(","))
,如下所示:
Arrays.stream(long[])
其他选项是在Stream<Long>
的结果上致电boxed()
以获取map()
,然后您可以拨打Arrays.stream(arr).boxed().map(String::valueOf).collect(Collectors.joining(","))
:
{{1}}
答案 1 :(得分:0)
您可以使用辅助方法将long[]
数组转换为Long[]
数组。
public static String longToString(long[] primitiveArray) {
Long[] boxedArray = Arrays.stream(primitiveArray).boxed().toArray(size -> new Long[size]);
return longToString(boxedArray);
}
如果您的目标不是自己动手,而是打算更好地打印数组,请使用Arrays.toString
,因为@alfasin已经提到过了。