是否可以定义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(FunctionThe
map()),为什么需要maptoxx
Stream
中的函数是这样定义的,因为
Stream
是一个对象引用流。但是
IntStream
是一个
int
流。如果我们像
Stream.map()那样定义
IntStream.map()
,结果将始终被装箱。这违背了使用
IntStream
的目的。