java - 如何在 Java 8 中引用 reduce() 操作的结果?

标签 java scala lambda java-stream reduce

我正在尝试写一个 mkString Java8 中的函数,一个 la Scala 的有用 mkString遇到了 2 个我可以寻求帮助的问题:

  1. 我无法提出 mkString 的第一个参数一个通用的 Collection 引用,例如 Collection<Object> c并让调用者调用任何类型的集合。

  2. 无法引用reduce()的返回结果在线访问结果的长度以删除额外的前导分隔符。

代码如下:

public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    System.out.println(mkString(numbers, ","));

}

public static String mkString(Collection<Integer> c, String sep) {
    return c.stream()
            .map(e -> String.valueOf(e))
            .reduce("", (a, b) -> a + sep + b)
            .substring(1, <<>>.length);
}

最佳答案

请注意,如果您这样做不是为了自学,而是为了在某些生产代码中实际使用它,您可能需要考虑内置的 Collectors.joining Collection 家:

String result = numbers.stream()
    .map(Object::toString)
    // or
    //   .map(x -> x.toString())  // exactly the same
    // or
    //   .map(String::valueOf)    // handles nulls by turning them to the string "null"
    .collect(Collectors.joining(","));

它有几个重载,类似于 Scala 的 mkString .不过,这个收集器只接受 CharSequence s,因此您需要将您的值显式转换为字符串作为单独的 map步骤。

此外,还有 String.join 方法,它也适用于 CharSequence 的集合秒。如果您特别有其中之一(例如 List<String> ),使用此方法可能比先将集合转换为流更方便:

List<String> strings = ...;

String result = String.join(",", strings);

// vs

String result = strings.stream().collect(Collectors.joining(","))

关于java - 如何在 Java 8 中引用 reduce() 操作的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54496864/

相关文章:

java - 从同步方法调用创建 CompletableFuture

multithreading - 这种死锁在 Scala Future 中是如何发生的?

java - scala 和 java 枚举之间的区别

java - jaxb 解码子 @XmlIDREF

java - 如果在没有任何选项的情况下运行 JVM,对内存使用有何影响?

scala - Scala 集合上的高效分组聚合

java - 为什么方法引用可以使用非最终变量?

java - 初始化数组的 Lambda 表达式

java - 使用列作为 QueryDSL 的正则表达式模式

java - 使用 Java 运行 Python 应用程序,然后解析其输出