首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >groovy中的闭包与java 8中的闭包(lambda表达式)?

groovy中的闭包与java 8中的闭包(lambda表达式)?
EN

Stack Overflow用户
提问于 2013-09-17 05:45:19
回答 2查看 8.7K关注 0票数 14

给定doSomething(Function foo) { println foo(2) }

Groovy:doSomething( { it*it } as Function )

Java:doSomething( (x) -> x*x )

这两者有什么区别吗?

EN

回答 2

Stack Overflow用户

发布于 2013-09-17 08:00:28

在Groovy中,闭包是groovy.lang.Closure类型的头等公民,而Java8中的lambdas是它们表示的默认方法接口的实际实例。

这意味着您需要在Groovy中使用as关键字(如您所示),但在Java中,您需要指定一个接口,因此在Groovy中,您可以这样做:

代码语言:javascript
复制
def adder( int i, Closure cl ) {
    cl( i )
}

int v = adder( 2 ) { i ->
    i + 8
}

assert v == 10

这在Java 8中成为:

代码语言:javascript
复制
public class Test {
    interface MyAdder {
        int call( int i ) ;
    }

    public int adder( int i, MyAdder adder ) {
        return adder.call( i ) ;
    }

    public static void main( String[] args ) {
        int v = new Test().adder( 2, (x) -> x + 8 ) ;
        System.out.println( v ) ;
    }
}

显然,您现在也可以在接口中声明默认实现,我在这里没有显示.

不确定这是不是所有的差异,但至少是不同的;-)

票数 10
EN

Stack Overflow用户

发布于 2013-09-25 08:48:16

  • 在Java表达式中,默认名称下无法引用Lambda表达式的参数。Groovy中也有类似的地方,我认为它就是" it“。
  • 在Java中,Lambda表达式是实现单个抽象方法类/接口的一种方便的方法。因此,如果必须为某些内容创建lambda表达式,则必须为其定义一个SAM接口。
  • 在Java中,Lambda表达式只能捕获那些实际上是最终变量的变量。
  • 在Java中,有一种通过使用方法引用来表示Lambda表达式的替代方法。因此,如果您有一些像{() -> new MyObject();}这样的lambda表达式,那么它可以编写为MyObject::new。我认为并非所有lambda表达式都可以使用方法引用来表示。

我认为将Java 8中的lambda表达式支持与更成熟的Groovy或Scala支持进行比较并不理想。这是Java引入lambda表达式的第一步,因此我们可以期待对lambda表达式有更成熟的支持。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18842109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档