将此lambda替换为方法参考

时间:2018-12-10 23:22:07

标签: java java-8 sonarqube java-stream

我有以下代码。 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>

3 个答案:

答案 0 :(得分:8)

这是模棱两可的,因为staticnon-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很聪明,不建议这样做。