【问题标题】:It is possible to define the return type of a lambda expression?是否可以定义 lambda 表达式的返回类型?
【发布时间】:2017-04-10 21:48:02
【问题描述】:

我有以下代码

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)

它有效。问题是编译器无法推断 map 中使用的 lambda 表达式的返回类型。有没有办法明确指定它?我个人觉得mapToxxx 的函数集很笨拙。

【问题讨论】:

  • 哎哟。再次删除类型...
  • 是的,你们都说得对,那是我的恐惧。
  • @juanpa.arrivillaga 不,这与擦除完全无关。这只是关于 OP 误读了文档。
  • @BrianGoetz 你是对的。懒得我了!我认为IntStreamStream 的子类,但事实并非如此(它是BaseStream 的子类),因此正如您所指出的,map 方法的签名不同。

标签: lambda java-8


【解决方案1】:

这与“声明 lambda 的返回类型”无关。你只是给map() 指定了一个无效的参数,编译器就是这么告诉你的。

IntStream 中的map 方法采用IntUnaryOperator(从intint 的函数)。没有方法Math.sqrt可以转换成这个签名。

【讨论】:

  • 你是对的@brian-goetz,我只是想知道如果 Stream 中的 map 函数定义为:<R> Stream<R> map(Function<? super T,? extends R> mapper) 并说“返回一个包含以下结果的流将给定函数应用于此流的元素"
  • Stream 中的map() 函数就是这样定义的,因为Stream 是一个对象引用流。但是IntStreamint 的流。如果我们像Stream.map() 一样定义Instream.map(),结果将总是被装箱。这违背了使用IntStream 的目的。
猜你喜欢
  • 2011-12-18
  • 2014-08-06
  • 2011-04-21
  • 1970-01-01
  • 2018-10-09
  • 2021-11-01
相关资源
最近更新 更多