Java 用方法引用替换此lambda

Java 用方法引用替换此lambda,java,java-8,sonarqube,java-stream,Java,Java 8,Sonarqube,Java Stream,我有以下代码。Sonar正在用方法引用替换此lambda Stream.iterate(0, i -> i + 1).limit(100).map(i -> Integer.toString(i)); 如果我用下面的it代码替换它,它不会编译,编译错误:类型不匹配:无法从流转换为 Integer::toString如何将Stream转换为?这是不明确的,因为和toString()方法都与函数签名Integer->String兼容。您可以改为使用String::valueOf。您不能

我有以下代码。Sonar正在用方法引用替换此lambda

Stream.iterate(0, i -> i + 1).limit(100).map(i -> Integer.toString(i));
如果我用下面的it代码替换它,它不会编译,编译错误:类型不匹配:无法从
转换为


Integer::toString
如何将
Stream
转换为

这是不明确的,因为和
toString()
方法都与函数签名
Integer->String
兼容。您可以改为使用
String::valueOf

您不能将
Integer::toString
放入,因为
Integer
有两种实现适合于函数接口
函数
,但您可以改为使用
String::valueOf

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

正如@shmosel所述,已经用方法引用替换lambda将导致歧义,因为符号有两种
toString
方法:

因为使用方法引用调用
Integer::toString
时,调用
Stream.iterate(0,i->i+1)
返回一个
Stream
,编译器不确定您是要执行
Integer.toString(i)
还是
i.toString()
,因此编译错误

因此,以下是已经提供的其他选项:

您可以使用
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()
Stream.iterate(0,i->i+1)//Stream
.limit(100)//流
.map(对象::toString);//整数->整数.toString()
其中
Object::toString
相当于lambda
integer->integer.toString()



另一方面,有趣的是,Sonar建议在您展示的代码中用方法引用替换lambda。intelliJ IDEA非常聪明,没有提出建议。

我认为
IntStream
更适合您的代码:

List<String> numbers = IntStream.range(0, 100)
                                .mapToObj(String::valueOf)
                                .collect(Collectors.toList());

您不能将
Integer::toString
放入,因为它接受
int
和您的案例
Integer
使用。那是不对的。Lambdas可以隐式装箱和取消装箱。@shmosel那么为什么
IntStream.range(1100).mapToObj(Integer::toString.collect(Collectors.toList())
工作呢?因为
int
重载更适合于基本流。@shmosel是的,关于Lambdas可以隐式装箱和取消装箱,你是对的
List<String> numbers = IntStream.range(0, 100)
                                .mapToObj(String::valueOf)
                                .collect(Collectors.toList());
List<String> numbers = Stream.iterate(0, i -> i + 1)
                             .limit(100)
                             .map(String::valueOf)
                             .collect(Collectors.toList());