Java-Lambda

先是掌握了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."); });

你可能感兴趣的:(Java-Lambda)