我有以下代码。 Sonar抱怨用方法参考代替此lambda。
Stream.iterate(0, i -> i + 1).limit(100).map(i -> Integer.toString(i));
如果我用下面的代码替换它,则它不会编译并出现编译错误:类型不匹配:无法从Stream<Object>
转换为<unknown>
。
Stream.iterate(0, i -> i + 1).limit(100).map(Integer::toString);
Integer::toString
如何将Stream<Object>
转换为<unknown>
?
答案 0 :(得分:8)
这是模棱两可的,因为static和non-static toString()
方法都与功能签名Integer -> String
兼容。您可以改用String::valueOf
。
答案 1 :(得分:5)
您不能放置Integer::toString
,因为Integer
有两个适合功能接口Function<Integer, String>
的实现,但是您可以改用String::valueOf
:
Stream.iterate(0, i -> i + 1)
.limit(100)
.map(String::valueOf)
.collect(Collectors.toList())
答案 2 :(得分:2)
正如@shmosel所提到的,已经用方法引用替换了lambda,这将导致模棱两可,因为存在两种toString
签名方法:
因为当您使用方法引用Stream.iterate(0, i -> i + 1)
调用Stream<Integer>
时,对map
的调用会返回Integer::toString
,因此编译器不确定您是否打算{{1} }或Integer.toString(i)
,从而导致编译错误。
因此,这是已经提供的其他选项:
您可以使用i.toString()
而不是Stream.iterate
然后致电IntStream.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()
等于lambda Object::toString
另外,有趣的是,Sonar建议您在显示的代码中用方法引用替换lambda。智能IDEA很聪明,不建议这样做。