是否可以定义lambda表达式的返回类型?
我有以下代码是否可以定义lambda表达式的返回类型?,lambda,java-8,Lambda,Java 8,我有以下代码 Random rnd = new Random(); rnd.ints().limit(100) .filter(i-> i > 0) .map(Math::sqrt) .forEach(System.out::println) 这将生成以下编译错误: Streams.java:12: error: incompatible types: bad return type in method reference
Random rnd = new Random();
rnd.ints().limit(100)
.filter(i-> i > 0)
.map(Math::sqrt)
.forEach(System.out::println)
这将生成以下编译错误:
Streams.java:12: error: incompatible types: bad return type in method reference
.map(Math::sqrt)
^
double cannot be converted to int
如果我改用
.mapToDouble(Math::sqrt)
它起作用了。问题是编译器无法推断映射中使用的lambda表达式的返回类型。有没有明确指定的方法?我个人觉得
maptoxx
函数集很笨拙 这与“声明lambda的返回类型”无关。您只是为map()
指定了一个无效参数,而编译器正在告诉您这一点
IntStream
中的map
方法采用IntUnaryOperator
(从int
到int
的函数)。没有可以转换为此签名的方法Math.sqrt
。可能与Ouch有关。再次输入擦除…是的,你们都是对的,这是我的恐惧。@juanpa.arrivillaga-Nope,这绝对与擦除无关。这只是关于OP误读文档的问题。@BrianGoetz你说得对。我真懒!我认为IntStream
是Stream
的一个子类,但事实并非如此(它是BaseStream
的一个子类),因此map
方法的签名是不同的,正如您所指出的。您是对的@brian goetz,我只是想知道,如果Stream中的map函数定义为:streammap(FunctionThemap()),为什么需要maptoxxStream
中的函数是这样定义的,因为Stream
是一个对象引用流。但是IntStream
是一个int
流。如果我们像Stream.map()那样定义IntStream.map()
,结果将始终被装箱。这违背了使用IntStream
的目的。