我听说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;
};
所以马上开始:
teamA
和teamB
类型?还是不是(像某种奇怪的泛型形式)?Lambda表达式只是用于实现目标接口的语法糖,这意味着您将通过lambda表达式在接口中实现特定方法。编译器可以推断接口中参数的类型,这就是为什么您不需要在lambda表达式中显式定义它们的原因。
例如:
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);
在此表达式中,lambda表达式显然实现了Comparator
字符串a,因此,这意味着lambda表达式是用于实现的语法糖compare(String, String)
。
因此,编译器可以安全地假设s1
and 类型s2
为String
。
您的目标接口类型提供了编译器确定lambda参数的实际类型需要的所有信息。
Oracle Corportion的Java语言架构师Briant Goetz发表了一些有关JDK 8
Lambdas正在进行的工作的文章。我相信您的问题的答案在那里:
第二篇文章介绍了如何在字节码级别实现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