一直对lambda只是使用可是没有系统的看过用法及原理,总结一下。java
java1.8为了提供lambda的支持提供了一系列的语法支持。express
java全部的都离不开对象,lambda表达式也不例外。lambda的本质实际上是函数式接口(functional interface)。以前就有不少应用,例如最多见的建立线程的方法。ide
Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("Hello World!"); } });
java1.8新增了一种函数式接口。函数
@FunctionalInterface public interface WorkerInterface { public void doSomeWork(); }
@FunctionalInterface就是标注该接口是函数式接口的注解。ui
1.8的接口里面已经能够增长方法体,须要加default关键字。线程
@FunctionalInterface public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } }
这个就是jdk自带的声明的 Lambda 表达式能够使用的函数式接口Consumer,里面带了一个方法实现。code
根据定义,函数式接口只能有一个抽象方法,若是你尝试添加第二个抽象方法,将抛出编译时错误。对象
下面咱们能够本身写一个实例:接口
//定义一个函数式接口 @FunctionalInterface public interface TestInterface { public void do(); } public class TestInterfaceTest { public static void execute(TestInterface test) { test.do(); } public static void main(String [] args) { //invoke do using Annonymous class execute(new TestInterface() { @Override public void do() { System.out.println("invoked using Anonymous class"); } }); //invoke do using Lambda expression execute( () -> System.out.println("invoked using Lambda expression") ); } }