提问者:小点点

将此lambda替换为方法引用[重复]


我有以下代码。Sonar抱怨用方法引用替换这个lambda。

Stream.iterate(0, i -> i + 1).limit(100).map(i -> Integer.toString(i));

如果我用下面的代码替换它,它不会编译并出现编译错误:类型不匹配:无法从Stream转换

Stream.iterate(0, i -> i + 1).limit(100).map(Integer::toString);

整数::如何转换流


共3个答案

匿名用户

你不能把Integer::toString,因为Integer有两个适合函数式接口的实现Function

Stream.iterate(0, i -> i + 1)
        .limit(100)
        .map(String::valueOf)
        .collect(Collectors.toList())

匿名用户

这是模棱两可的,因为静态和非静态toString()方法都与函数签名Integer-兼容

匿名用户

正如@shmosel所提到的,已经用方法引用替换lambda将导致歧义,因为signarure有两个toString方法:

  • String toString()
  • 静态字符串到字符串(int i)

因为对Stream. iterate(0,i-

所以这里是已经提供的其他选择:

您可以使用IntStream. iterate而不是Stream.iterate,然后调用mapToObj

IntStream.iterate(0, i -> i + 1) // IntStream
         .limit(100) // IntStream
         .mapToObj(Integer::toString); // i1 -> Integer.toString(i1)

intelliJ建议的另一件事是您实际上可以做:

Stream.iterate(0, i -> i + 1) // Stream<Integer>
      .limit(100) // Stream<Integer>
      .map(Object::toString); // integer -> integer.toString()

其中对象::toString等价于lambda整数-

另一方面,有趣的是,Sonar建议在您显示的代码中用方法引用替换lambda。intelliJ IDEA足够聪明,没有建议它。