为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

莫回无 2022-06-04 15:28:12
我试图用mkStringJava8 编写一个函数,这是一个 Scala 的有用函数,但mkString遇到了 2 个问题,我可以使用一些帮助:我无法使mkString泛型 Collection 引用的第一个参数像Collection<Object> c并且让调用者调用任何类型的集合。无法引用reduce()in-line 返回的结果来访问结果的长度以删除多余的前导分隔符。这是代码: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);}
查看完整描述

3 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

请注意,如果您这样做不是为了自学,而是为了在某些生产代码中实际使用它,您可能需要考虑内置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. 不过,此收集器仅接受CharSequences,因此您需要将值显式转换为字符串作为单独的map步骤。


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


List<String> strings = ...;


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


// vs


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


查看完整回答
反对 回复 2022-06-04
?
慕斯709654

TA贡献1840条经验 获得超5个赞

如果我没记错我的 java,您可以声明参数类型Collection<?>以便能够传递任何对象的集合。

至于咬掉分隔符,我认为,只会.substring(1)做你想做的事。


查看完整回答
反对 回复 2022-06-04
?
aluckdog

TA贡献1847条经验 获得超7个赞

你可以这样做:

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}


查看完整回答
反对 回复 2022-06-04
  • 3 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信