我正在尝试写一个 mkString
Java8 中的函数,一个 la Scala 的有用 mkString
遇到了 2 个我可以寻求帮助的问题:
我无法提出
mkString
的第一个参数一个通用的 Collection 引用,例如Collection<Object> c
并让调用者调用任何类型的集合。无法引用
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/