java 8引入lambda迫切需求是因为lambda 表达式能简化集合上数据的多线程或者多核的处理,提供更快的集合处理速度
函数式接口
Java 8 引入的一个核心概念是函数式接口(Functional Interfaces)。通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。同时,引入了一个新的注解:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了 @FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错,可以拥有若干个默认方法。
java.lang.Runnable 就是一个函数式接口。 @FunctionalInterface public interface Runnable { public abstract void run(); }
lambda表达式
Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现。
lambda语法包含三个部分:
1)一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数
2)一个箭头符号: ->
3)方法体,可以是表达式和代码块,方法体函数式接口里面的方法实现,如果是代码块要用{ }包起来,并且需要 return 返回值,如果方法返回值是 void 则不需要 { }
/** * @description: lambda表达式 * @author: liuxin * @create: 2019-01-26 18:39 **/ public class Test { private static void runNew(){ /* * Runnable是一个函数接口,只包含一个无参数返回void的run方法 * 所以lambda表达式没有参数也没有return * */ new Thread(()-> System.out.println("lambda方法")).start(); } private static void runOld(){ new Thread(new Runnable() { @Override public void run() { System.out.println("内部类实现方法"); } }).start(); } public static void main(String[] args) { Test.runNew(); Test.runOld(); } }
使用lambda表达式可以使代码更加简洁的同时保持可读性。
方法引用
方法引用是lambda表达式的一个简化写法,引用的方法其实是表达式的方法体实现,语法非常简单,左边是容器(类名,实例名)中间是“” :: “”,右边则是相应的方法名。
ObjectReference::methodName
引用格式:
1)静态方法:ClassName::methodName。例如 Object::equals
2)实例方法:Instance::menthodName。例如 Object obj =new Object();obj::equals
3)构造函数:ClassName::new
/** * @description: 方法引用 * @author: liuxin * @create: 2019-01-26 18:58 **/ public class TestMethod { public static void main(String[] args) { ArrayList<Integer> a =new ArrayList<>(); a.add(1); a.add(2); //这里addActionListener方法的参数是ActionListener,是一个函数式接口 //使用lambda表达式方式 a.forEach(e -> { System.out.println("Lambda实现方式"); }); //使用方法引用方式 a.forEach(TestMethod::sys); } public static void sys(Integer e) { System.out.println("方法引用实现方式"); } }
这里的sys()方法就是lambda表达式的实现,这样的好处是,当方法体过长影响代码可读性时,可以使用方法引用。