您的位置:首页 > 编程语言 > Java开发

Java-Lambda

2016-03-03 09:43 302 查看
先是掌握了C#的Lambda,之后以为Java的Lambda也是一样的,但是当想要实现Java时,突然发现了一个问题,Java里几乎所有的东西都是对象,在Java中定义的函数或方法不能完全独立,也就是说我们不能直接将函数当为变量来进行传递。在C#中,我们定义一个委托,然后定义一个方法,可以将方法当为变量传递给委托,但是在Java中则不行,我们必须定义某个类,在类中实现我们的函数。简而言之,在 Java 里将普通的方法或函数像参数一样传值并不简单,为此,Java 8 增加了一个语言级的新特性,名为 Lambda 表达式。

在函数式编程中,函数是一等公民,你可以将其复制给一个变量,或者将他们当作参数传递给其他函数。但是由于Java是相对较为面向对象的语言,一个Java对象中可以包含属性和方法(函数),方法(函数)不能孤立于对象单独存在。这样就产生了一个问题,有时候需要把一个方法(函数)作为参数传到另外一个方法中的时候(比如回调功能),就需要创建一个包含这个方法的接口,传递的时候传递这个接口的实现类,一般是用匿名内部类的方式来实现。我们看看到底怎么实现的。

首先看一下什么是函数式接口。在 Java 中,Marker(标记)类型的接口是一种没有方法或属性声明的接口,简单地说,marker 接口是空接口。相似地,函数式接口是只包含一个抽象方法声明的接口。java.lang.Runnable 就是一种函数式接口,在 Runnable 接口中只声明了一个方法 void run(),相似地,ActionListener 接口也是一种函数式接口,我们使用匿名内部类来实例化函数式接口的对象,有了 Lambda 表达式,这一方式可以得到简化。

举个例子吧,看看Lambda到底有什么好处

比如我们要创建一个线程,我们使用Runnable的方式来创建

//陈旧的方法:笨而繁琐
class User implement Runnable{
public void run(){
System.out.println("Hello from thread");
}
}
public static void main(String[] args) {
User uu = new User();
Thread myThread = new Thread(uu);
myThread.start();
}
//旧方法:匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello from thread");
}
}).start();

//新方法:Lambda
new Thread(
() -> System.out.println("Hello from thread")
).start();


还有下面这一个,我们使用匿名类给方法传递函数功能,比如事件监听代码:

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("The button was clicked.");
}
});


通过这种方式我们将一些函数功能传递给addActionListener方法。繁琐而且可读性不高。

看看Lambda方法吧

button.addActionListener( (e) -> {
System.out.println("The button was clicked.");
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: