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

Java Lambda和闭包

常智勇
2023-03-14
问题内容

我听说lambda即将传到您附近的Java(J8)。我在某个博客上找到了一个示例,说明了它们的外观:

SoccerService soccerService = (teamA, teamB) -> {
    SoccerResult result = null;
    if (teamA == teamB) {
        result = SoccerResult.DRAW;
    }
    else if(teamA < teamB) {
        result = SoccerResult.LOST;
    }
    else {
        result = SoccerResult.WON;
    }

    return result;
};

所以马上开始:

  • 在哪里teamAteamB类型?还是不是(像某种奇怪的泛型形式)?
  • Lambda是 一种 封闭 类型 ,还是相反?
  • 与典型的匿名功能相比,这将给我带来什么好处?

问题答案:

Lambda表达式只是用于实现目标接口的语法糖,这意味着您将通过lambda表达式在接口中实现特定方法。编译器可以推断接口中参数的类型,这就是为什么您不需要在lambda表达式中显式定义它们的原因。

例如:

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);

在此表达式中,lambda表达式显然实现了Comparator字符串a,因此,这意味着lambda表达式是用于实现的语法糖compare(String, String)

因此,编译器可以安全地假设s1and 类型s2String

您的目标接口类型提供了编译器确定lambda参数的实际类型需要的所有信息。

Oracle Corportion的Java语言架构师Briant Goetz发表了一些有关JDK 8
Lambdas正在进行的工作的文章。我相信您的问题的答案在那里:

  • 拉姆达州。
  • 拉姆达州图书馆版。
  • Lambda表达式的翻译
  • JVMLS 2012:用Java实现Lambda表达式

第二篇文章介绍了如何在字节码级别实现lambda表达式,并可以帮助您深入研究第二个问题的细节。



 类似资料:
  • 假设我有一个外部 JSON,如下所示: 这意味着我想在Person对象列表中检查姓名为< code >“jack”和< code >年龄的人 然而,我想使这个过滤器可配置,也适用于多个过滤器。假设下面的人pojo(这是不言自明的),取姓名和年龄,我如何使过滤器动态或可配置的? 我期待一个因此满足标准的 Person 对象列表。

  • 我正在测试java的lambda是否与接口函数匹配,我在下面写了代码,它可以工作。我有接口和它的。在构建时,Javalambda被转换为我的接口的实现者。 程序将打印。到目前为止还不错,但是如果我在中添加一些其他函数声明,如下所示: 线程构造函数中的lambda将无法编译,表示 那么,Java编译器什么时候可以决定lambda可以匹配MyHandler的类型,而不管我的函数名是什么?Justing

  • 我有下面的类和对象的ArrayList: 我想要的是从我的列表中得到一个字符串和整数地图,其中包含门票中的目的地和我列表中每个目的地的出现次数。我想它会这样开始,但是我不知道如何继续:

  • 闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。 因为 函数 是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。 模拟私有变量 function Counter(start) { var count = start; return { increment: function() {

  • 大概是这样的: 谢谢[已解决] 也感谢Umer Farooq的回答:从lambda内部修改局部变量

  • 闭包作为参数(Taking closures as arguments) 现在我们知道了闭包是 trait,我们已经知道了如何接受和返回闭包;就像任何其它的 trait! 这也意味着我们也可以选择静态或动态分发。首先,让我们写一个获取可调用结构的函数,调用它,然后返回结果: fn call_with_one<F>(some_closure: F) -> i32 where F : Fn(i