使用Java 8流将long []转换为String

时间:2015-10-10 22:17:51

标签: java java-8 java-stream

我想将像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的流功能很陌生。

2 个答案:

答案 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已经提到过了。