文章源自:http://developer.51cto.com/art/201404/435591.htm
函数式接口
函数式接口(functional interface 也叫功能性接口,其实是同一个东西)。简单来说,函数式接口是只包含一个方法的接口。比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口。java 8提供 @FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断, 但 最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。
Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现,下面讲到语法会讲到
Lambda语法
包含三个部分
一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数
一个箭头符号:->
方法体,可以是表达式和代码块,方法体函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}
总体看起来像这样
(parameters) -> expression 或者 (parameters) -> { statements; }
看一个完整的例子,方便理解
/** * 测试lambda表达式 * * @author benhail */ public class TestLambda { public static void runThreadUseLambda() { //Runnable是一个函数接口,只包含了有个无参数的,返回void的run方法; //所以lambda表达式左边没有参数,右边也没有return,只是单纯的打印一句话 new Thread(() ->System.out.println("lambda实现的线程")).start(); } public static void runThreadUseInnerClass() { //这种方式就不多讲了,以前旧版本比较常见的做法 new Thread(new Runnable() { @Override public void run() { System.out.println("内部类实现的线程"); } }).start(); } public static void main(String[] args) { TestLambda.runThreadUseLambda(); TestLambda.runThreadUseInnerClass(); } }
可以看出,使用lambda表达式设计的代码会更加简洁,而且还可读。
方法引用
其实是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现,语法也很简单,左边是容器(可以是类名,实例名),中间是"::",右边是相应的方法名。如下所示:
ObjectReference::methodName
一般方法的引用格式是
- 如果是静态方法,则是ClassName::methodName。如 Object ::equals
- 如果是实例方法,则是Instance::methodName。如Object obj=new Object();obj::equals;
- 构造函数.则是ClassName::new
再来看一个完整的例子,方便理解
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import javax.swing.JButton; import javax.swing.JFrame; /** * * @author benhail */ public class TestMethodReference { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setLayout(new FlowLayout()); frame.setVisible(true); JButton button1 = new JButton("点我!"); JButton button2 = new JButton("也点我!"); frame.getContentPane().add(button1); frame.getContentPane().add(button2); //这里addActionListener方法的参数是ActionListener,是一个函数式接口 //使用lambda表达式方式 button1.addActionListener(e -> { System.out.println("这里是Lambda实现方式"); }); //使用方法引用方式 button2.addActionListener(TestMethodReference::doSomething); } /** * 这里是函数式接口ActionListener的实现方法 * @param e */ public static void doSomething(ActionEvent e) { System.out.println("这里是方法引用实现方式"); } }
可以看出,doSomething方法就是lambda表达式的实现,这样的好处就是,如果你觉得lambda的方法体会很长,影响代码可读性,方法引用就是个解决办法.
相关推荐
在本篇文章中,我们将深入探讨Java 8中的关键语法改进,包括函数式编程、Lambda表达式、Stream API、日期与时间API、默认方法以及方法引用来帮助你更好地理解和应用这些新特性。 1. **Lambda表达式**: Lambda...
通往lambda之路_语法篇 Chapter 2: 深入解析默认方法 Chapter 3: 解开lambda最强作用的神秘面纱 Chapter 4: 类型注解 复杂还是便捷 Chapter 5: 重复注解(repeating annotations) Chapter 6: 泛型的目标类型推断 ...
Java8新特性之lambda的作用_动力节点Java学院,动力节点口口相传的Java黄埔军校
通往lambda之路_语法篇 Chapter 2: 深入解析默认方法 Chapter 3: 解开lambda最强作用的神秘面纱 Chapter 4: 类型注解 复杂还是便捷 Chapter 5: 重复注解(repeating annotations) Chapter 6: 泛型的目标类型推断 ...
通往lambda之路_语法篇 Chapter 2: 深入解析默认方法 Chapter 3: 解开lambda最强作用的神秘面纱 Chapter 4: 类型注解 复杂还是便捷 Chapter 5: 重复注解(repeating annotations) Chapter 6: 泛型的目标类型推断 ...
### Java系列JDK 1.8 新特性之 Lambda表达式 #### 1、Lambda表达式介绍 Lambda表达式是Java 8中引入的一个重要新特性,它允许开发者以一种更加简洁的方式编写函数式接口实现代码。Lambda表达式本质上是一个匿名...
### Java 8 中 Lambda 表达式的全解析 #### 引言 Java 8 自发布以来,便成为了 Java 发展史上的一大里程碑。这次版本更新带来了众多重要的新特性,其中最引人注目的当属 Lambda 表达式。这一功能不仅为 Java ...
Java8之lambda最佳实践_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
Java 8是Java语言发展史上一个重要的里程碑,它引入了多种新特性,旨在增强Java语言表达能力和提升开发效率。其中,Lambda表达式和函数式编程的支持是最具影响力的变化之一。 函数式编程是一种编程范式,它将计算视...
Java 8是Java语言的一个重要版本,引入了许多创新特性,极大地提升了开发效率和代码的可读性。其中,Stream API和Lambda表达式是最为显著的两大亮点,它们为处理集合数据提供了新的方式,并且简化了多线程编程。下面...
Java Lambda 表达式是Java 8引入的一项重要特性,它极大地简化了函数式编程,使得处理集合数据和异步编程变得更加简洁。Lambda表达式在Java中被设计为一种匿名函数,可以没有名称地传递,并且可以当作参数或返回值。...
Java 8 的引入,尤其是Lambda表达式,对Java语言产生了深远的影响,它为Java开发者带来了更简洁、更灵活的编程方式。Lambda表达式是函数式编程的核心元素,它允许我们将函数作为方法参数传递,或者将代码块当作数据...
Java 8 的 Lambda 表达式是其最显著的新特性之一,它引入了一种更为简洁、函数式的编程风格。Lambda 表达式使得处理匿名函数变得更加简单,尤其在需要定义短小、无状态的代码块时,它们可以极大提高代码的可读性和...
Java8新特性之lambda_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
Java 8 新特性之Stream 和 Lambda
全网详解(波哥)Java8新特性(Lambda、Stream、LocalDate等)新特性 自学java的同行们应该都要学习java8的新特性,譬如:(Lambda、Stream、LocalDate等)!本人在学习java的时候看的是波哥的视频,确实讲的不错,很...
Java 8是Java语言的一个重大版本更新,它引入了lambda表达式,这是Java平台的核心特性之一。Lambda表达式为Java带来了函数式编程的元素,使得开发者可以以更简洁的方式编写代码,尤其是在集合和多线程方面。本资料...
Lambda表达式是Java 8引入的一个重要特性,它是一种函数式编程的体现,可以将代码块当作对象处理。Lambda表达式使得我们可以更加简洁地编写匿名函数,特别是用于那些只需要一次使用的简单功能。Lambda表达式的语法...
Java Lambda表达式是Java 8引入的一项重大特性,它彻底改变了我们编写函数式编程的方式,使得代码更加简洁、高效。Lambda表达式的核心理念是将功能作为方法参数传递,或者将其存储为字段,甚至在没有显式类型声明的...