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的方式来创建
还有下面这一个,我们使用匿名类给方法传递函数功能,比如事件监听代码:
通过这种方式我们将一些函数功能传递给addActionListener方法。繁琐而且可读性不高。
看看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."); });
相关文章推荐
- Spring Hibernate Validator 国际化动态参数不起作用的解决办法
- spring配置文件中xsd引用问题
- Java类加载机制
- Java的Struts2框架配合Ext JS处理JSON数据的使用示例
- Spring Data JPA简单实例
- java中大数类的学习
- 转:java中scanner类的用法
- java模糊搜索
- java进制间转换
- No_16_0302 Java基础学习第十天
- 【leetcode】【78】Subsets
- **spring mvc 整合hibernate 配置,弄了好几天
- spring mvc 返回方式:ModelAndView, Model, ModelMap, Map,View, String, void
- java通过正则表达式提取XML节点内容
- Java Class的field如果以小写t开头
- spring boot
- 深入了解java虚拟机
- java io 学习部分整理
- Spring配置文件详解
- Java正则表达式入门