Java 用方法引用替换此lambda
我有以下代码。Sonar正在用方法引用替换此lambdaJava 用方法引用替换此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。您不能
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
相当于lambdainteger->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());