当前位置: 首页 > 知识库问答 >
问题:

具有返回类型的使用者接口的lambda表达式

龚伯寅
2023-03-14

我已经为使用者接口尝试了类似s->s.isempty()这样的lambda表达式,它没有问题。其他一些lambda表达式不起作用,因为它们返回一些东西,如s->s

Consumer<String> cons1 = s -> s.isEmpty();
cons1.accept("abc");

编译和执行没有问题。

所以我遇到的问题是,我认为像s->s.isempty()这样的lambda表达式总是等效于s->{return s.isempty()};,所以我希望编译器会给我一个错误,因为您不能从使用者接口返回boolean(或任何其他类型)。显然,编译器正在将lambda表达式转换为一个方法,如果没有return语句,并且调用方法isempty()而不实际返回值。所以问题是什么时候返回被添加到lambda表达式的主体中?这样我就可以知道编译器什么时候会给出编译器错误以及为什么。

共有1个答案

沃驰
2023-03-14

规范中有明确的定义,如果lambda的主体是语句表达式,如果返回类型为void,结果将被丢弃

如果lambda的主体是一个语句表达式(即允许作为语句独立存在的表达式),则它与产生空函数类型兼容;任何结果都被简单地丢弃。因此,例如,以下两者都是合法的:

 //Predicate has a boolean result
   Predicate<String> p = s -> list.add(s);

// Consumer has a void result
   Consumer<String> c = s -> list.add(s);

一般来说,()->expr形式的lambda(其中expr是语句表达式)根据目标类型被解释为()->{return expr;}()->{expr;}

 类似资料:
  • 将异常获取为 :lambda表达式中的返回类型错误:

  • 以下代码在IntelliJ和Eclipse中编译得很好,但JDK编译器1.8.0\u 25对此表示不满。首先,代码。 javac 1.8.0\u 25的输出为: 当我更换时?超级E只需使用E,JDK就能成功编译。 当我将替换为,JDK编译成功。 由于它适用于JDK 1.8.0_60,我怀疑它是编译器错误。 有没有详细说明是什么原因造成的以及何时修复的?

  • 我正在学习Java中的Lambda并试图理解它。例如,我有以下代码: 我不理解这个语句我看到是类型的引用变量。但是我不明白这个到底是什么。这是方法定义吗?这个方法的返回类型是什么?我认为应该是,因为方法的返回类型是。如有任何反馈将不胜感激。

  • 当交换机分支调用void返回类型的方法时,有没有办法强制对所有枚举值进行彻底检查?仅仅为了诱使编译器要求穷尽性而对产量进行硬编码是非常丑陋的。 这是我当前的模式(handle方法具有void返回类型) 我想使用表达式的原因是在添加新枚举值但未处理时出现编译错误。

  • 我正在尝试返回一个对象,它应该是IClass的一个实现,具有一个通用类型,是IType的一个实现。 我要返回的实际类扩展了Class (abstract ),其泛型类型为ActualType: 抽象类对象实现了IClass接口,可以有任何扩展IType的类型 ActualType只是实现了IType接口 我在编译时得到一个“类型不匹配:无法从ActualClass转换为IClass”错误。我不明白

  • 我有一个静态的通用FormBuilder超文本标记语言助手方法(HTMLHelper类上的扩展方法),它接受视图模型类型的通用参数,然后当从数据库传递一个或多个字符串属性名称时,生成一个超文本标记语言形式在ASP. NET MVC 5.1 with. NET 4.5中。 我有一个公共方法来生成表单,还有单独的私有方法来生成表单中的“模块”部分,然后渲染其中的每个字段。类型参数从上到下沿此链传递。