【问题标题】:Convert long[] to String using Java 8 streams使用 Java 8 流将 long[] 转换为字符串
【发布时间】:2015-10-10 22:17:51
【问题描述】:

我想将像long[] l1 = { 1, 2, 3, 4 }; 这样的原始长数组转换为字符串。此字符串应包含这些值中的每一个,并以, 作为分隔符。

我想通过使用 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 的流功能还很陌生。

【问题讨论】:

  • 看起来并不比Arrays.toString(l)简单...
  • Arrays.toString(l) 返回格式类似于[1, 2, 3, 4]。注意逗号后面的括号和空格。 OP 可能要求字符串应该看起来像1,2,3,4,在这种情况下Arrays.toString 不适合。如果格式无关紧要,那么我同意这将是一个比尝试用流重新发明轮子更好的解决方案:)

标签: java java-8 java-stream


【解决方案1】:

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

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

this answer 中所述,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(","))

其他选项是在 Arrays.stream(long[]) 的结果上调用 boxed() 以获取 Stream<Long>,然后您可以在其上调用 map()

Arrays.stream(arr).boxed().map(String::valueOf).collect(Collectors.joining(","))

【讨论】:

    【解决方案2】:

    您可以使用辅助方法将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 已经提到的那样。

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多