2、Lambda表达式
从 JDK 8 开始,Java 中引入了一个 FunctionalInterface 的概念。FunctionalInterface 即只定义了一个方法的接口,例如:
public interface Runnable { void run(); } public interface Callable<V> { V call(); } public interface Consumer<T> { void accept(T t); } public interface BiConsumer<T, U> { void accept(T t, U u); }
等等。而 Lambda 表达式可以让我们用更少的代码来实现 FunctionalInterface 的匿名类。
例如:
Thread thread = new Thread(new Runnable() { @Override public void run() { doSomething(); } }
可以用 Lambda 表达式写为:
Thread thread = new Thread(() -> { doSomething(); });
如果代码块里只有一行代码,还可以省略掉大括号:
Thread thread = new Thread(() -> doSomething());
又例如:
Function<String, List<String>> function = new Function<>() { @Override public List<String> accept(String str) { list.add(str); return list; } };
可以用 Lambda 表达式写为:
Function<String, List<String>> function = (str) -> { list.add(str); return list; };
再例如:
Supplier<Set<String>> supplier = new Supplier<>() { @Override public Set<String> get() { return new HashSet<String>(); } };
可以用 Lambda 表达式写为:
Supplier<Set<String>> supplier = () -> { return new HashSet<String>(); };
由于代码块里只有一行代码,可以省略掉大括号和 return 关键字:
Supplier<Set<String>> supplier = () -> new HashSet<String>();
如果 lambda 表达式对应的 FunctionalInterface 的方法没有参数,而且方法体内直接调用一个类的无参构造方法来返回一个对象的话,还可以使用 Class::new 这样的语法进一步简化代码:
Supplier<Set<String>> supplier = HashSet::new;