我试图用mkString
Java8编写一个mkString
函数,这是一个la Scala的有用mkString
,我遇到了两个问题,我需要一些帮助:
mkString
的第一个参数成为像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);
}
发布于 2019-02-02 20:47:08
请注意,如果您这样做不是为了自我教育,而是为了在某些生产代码中实际使用它,您可能需要考虑内置的Collectors.joining
收集器:
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
,因此需要将值显式转换为字符串,作为单独的map
步骤。
此外,还有String.join
方法,它也适用于CharSequence
的集合。如果您有其中一个方法(例如List<String>
),那么使用此方法可能更方便,而不是首先将集合转换为流:
List<String> strings = ...;
String result = String.join(",", strings);
// vs
String result = strings.stream().collect(Collectors.joining(","))
发布于 2019-02-02 19:52:20
如果我正确地记住了我的java,您可以将参数类型声明为Collection<?>
,以便能够传递任何对象的集合。
至于咬掉分离器,我想,只要.substring(1)
做你想做的事。
发布于 2019-02-02 20:05:15
你可以这样做:
public static <T> String mkString(Collection<T> c, String sep) { // generic impl
return c.stream()
.map(String::valueOf)
.reduce("", (a, b) -> a + sep + b)
.substring(1); // substring implementation to strip leading character
}
https://stackoverflow.com/questions/54496864
复制相似问题