当前位置: 首页 > 面试题库 >

为什么不能为Java中的var关键字分配一个lambda表达式?

商曦
2023-03-14
问题内容

允许var在Java 10中使用类似以下的字符串进行分配:

var foo = "boo";

虽然不允许为其分配lambda表达式,例如:

var predicateVar = apple -> apple.getColor().equals("red");

为什么不能推断的λ或方法引用类型时,它可以推断出休息等StringArrayList,用户类等?


问题答案:

从局部变量类型推断JEP:

实质上,推断过程只是将变量赋予其初始化程序表达式的类型。一些细微之处:

  • 初始化程序没有目标类型(因为我们尚未推断出它)。需要这种类型的多边形表达式(例如 lambdas ,方法引用和数组初始化器)将触发错误。

由于Lambda表达式本身没有类型,因此无法针对进行推断var

…同样,可以设置默认规则。

当然,您可以想出一种方法来解决此限制。为何开发人员决定不这样做,实际上取决于猜测,除非参与决策的人可以在这里回答。无论如何,如果您有兴趣,可以在以下openjdk邮件列表中查询:http
:
//mail.openjdk.java.net/mailman/listinfo

如果我猜到了,他们可能不想将lambda推断var与一组特定的功能接口类型相关联,这将排除任何第三方功能接口类型。更好的解决方案是推断一个通用函数类型(即(Apple) -> boolean),然后将其转换为兼容的功能接口类型。但是JVM没有这种函数类型,并且在创建lambda表达式的项目期间已经做出了不实现它们的决定。同样,如果您对具体原因感兴趣,请询问开发人员。



 类似资料:
  • 问题内容: 我试图为对象类型分配一个lambda: 它给我一个错误的说法: 为什么会这样,怎么做? 问题答案: 这是不可能的。根据错误消息不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如

  • 我知道使用lambda expression(LE)我们可以节省一些代码行,比如为函数接口创建对象。而且LE将更易读。但我确信这并不是提供该功能的主要原因。我在google上搜索,并在本文中找到了这段有趣的引用 在Java8之前,处理任何集合的元素都可以通过从集合中获取迭代器,然后迭代元素,然后处理每个元素来完成。如果需要并行处理这些元素,那么将由客户端代码完成。随着Java 8中Stream A

  • 问题内容: 我升级到Java 8,并尝试用新的lamdba表达式替换Map中的简单迭代。循环搜索空值,如果找到一个,则引发异常。旧的Java 7代码如下所示: 我将其转换为Java 8的尝试如下所示: 谁能解释为什么此处不允许该声明以及如何更正该声明? Eclipse的快速修复建议对我来说并不正确……它只是在语句周围加上了一个块: 问题答案: 不允许抛出检查异常,因为接口中的方法未在其子句中声明任

  • jdk 11中使用“var”时编译时的问题 如何避免IntelliJ重置语言级别?

  • 在Java中lambda表达式是怎样的对象?作为函数式编程的一部分,lambda表达式如何在Java中实现,而Java是一种面向对象的语言?我需要哪些Java概念来理解lambda表达式?

  • 问题内容: 为什么在Java中不使用const关键字? 您能看到在Java语法中使用某些可传递const或不可变关键字的任何缺点,还是为什么选择了常见的繁琐方法? 您能看到关闭请求的 原因 ,Sun提供了任何解释吗? 问题答案: 您能看到关闭请求的原因吗,Sun是否提供任何解释? 是。Sun在请求本身中提供了三个为什么不对请求执行操作的原因。我引用: “目前尚无计划将此功能添加到Java中。除了蔓