函数式接口是一种包含单一抽象方法(single abstract method)的接口。类通过为接口中的所有方法提供实现来实现任何接口,这可以通过顶级类(top-level class)、内部类甚至匿名内部类完成。
public class RunnableDemo { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println( "inside runnable using an anonymous inner class"); } }).start(); } }
匿名内部类
使用lambda表达式
new Thread(()-> System.out.println("inside runnable using an anonymous inner class")).start();
将 lambda 表达式赋给变量
Runnable r = ()-> System.out.println("inside runnable using an anonymous inner class"); new Thread(r).start();
FilenameFilter 的匿名内部类实现
File directory = new File("./src/main/java"); String[] names = directory.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".java"); } }); System.out.println(Arrays.asList(names));
FilenameFilter 接口的 lambda 表达式实现
File directory = new File("./src/main/java"); String[] names = directory.list((dir, name) -> name.endsWith(".java")); System.out.println(Arrays.asList(names)); }
具有显式数据类型的 lambda 表达式
File directory = new File("./src/main/java"); String[] names = directory.list((File dir, String name) -> name.endsWith(".java"));
lambda 代码块
File directory = new File("./src/main/java"); String[] names = directory.list((File dir, String name) -> { return name.endsWith(".java"); }); System.out.println(Arrays.asList(names));
lambda 表达式的实现多于一行,则需要使用大括号和显式返回语句。
这就是 lambda 代码块(block lambda)。在本例中,虽然代码主体只有一行,但可以使用大括号将多个语句括起来。注意,不能省略 return 关键字。