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

标签 java java-8 java-stream

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

最佳答案

使它适用于原始数组的一种方法是:

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()正如塔吉尔在他的评论中提到的那样。因为String.valueOf为许多不同的类型重载,您不必将对象转换为 Long,只需使用对 String.valueOf 的方法引用像这样:

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

其他选择是调用 boxed() 关于 Arrays.stream(long[]) 的结果得到Stream<Long>然后你可以调用map() :

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

关于java - 使用 Java 8 流将 long[] 转换为 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33059516/

相关文章:

java - 使用流有条件地填充 map - Java 8

java - 如何使用 Java 8 流获取 Map 中出现频率最高的单词及其相应的出现频率?

java - 比较公共(public)对象的 2 个 HashSet

java - 嵌套集合 lambda 迭代

java - 将文件加载到 java.util.Properties 中的一行代码

java - 是否有等同于 Scala 集合 "collect"的 Java Stream 方法?

java - LambdaMetaFactory 中的类型

java - 流式传输时重新抛出异常

java - Facebook 应用程序的测试帐户(例如 JUnit 测试手册)

java - 了解 JAX-WS 中的 @Oneway 注释