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

pim*_*eys 4 java java-8 java-stream

我想将原始长数组转换long[] l1 = { 1, 2, 3, 4 };为String.此String应具有这些值中的每一个,以,as分隔符分隔.

我想通过使用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;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这项工作longToString(long... l)取而代之longToString(Long... l)

另外:我是否设法找到转换它的最佳方式,还是可以进一步简化?我对Java 8的流功能很陌生.

Boh*_*rdt 6

使原始数组工作的一种方法是:

long[] arr = { 1, 2, 3, 4 };
Arrays.stream(arr).mapToObj(l -> ((Long) l).toString()).collect(Collectors.joining(","))
Run Code Online (Sandbox Code Playgroud)

正如在这个答案中所解释的那样,Arrays.stream(long[])创建LongStream,而不是Stream<Long>,所以你需要使用在这种情况下mapToObj()会产生的方法Stream<String>.

你可以让这个版本更加紧凑,使用String.valueOf(),而不是Long.toString()作为Tagir提到了他的评论.因为String.valueOf许多不同类型的重载,您不必将对象强制转换为Long,只需使用方法引用,String.valueOf如下所示:

Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(","))
Run Code Online (Sandbox Code Playgroud)

其他选项是调用boxed()上的结果Arrays.stream(long[])得到Stream<Long>的,你可以调用map():

Arrays.stream(arr).boxed().map(String::valueOf).collect(Collectors.joining(","))
Run Code Online (Sandbox Code Playgroud)