我有以下代码。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);
整数::如何转换流
你不能把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足够聪明,没有建议它。