1 接口的默认方法
接口(Interface)中可以有方法的具体实现,使用default这一关键字进行标记。可以有一个至多个default修饰的方法,调用过程与传统的类(Class)中的方法一致。
简单的示例如下:
interface Interface1 {
default void print() {
System.out.println("a default method");
}
default void print1() {
System.out.println("another default method");
}
void print2();
}
2 Lambda表达式
Lambda表达式允许函数作为一个参数传入方法中,使得对象的创建更加简洁。
因为函数是匿名传入的,所以一般采用只有一个抽象函数的接口(函数式接口),这样才能与Lambda表示式适配。
以生成一个Runnable接口的实现类对象为例,比较传统方法和Lambda表达式的区别。
传统的匿名对象:
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new Runnable() {
@Override
public void run() {
System.out.println("run method");
}
});
使用Lambda表达式后:
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(() -> System.out.println("run method"));
3 函数式接口
函数式接口使用@FunctionalInterface注解表示,修饰于接口。表示该接口有且仅有一个抽象方法,但是可以存在多个非抽象方法。函数式接口可以隐式地转换为Lambda表达式。
例如Runnable接口,Comparator接口。
4 方法引用
方法引用是通过::关键字来引用类的静态方法或成员方法,一般与流Stream一起使用。
5 Stream
Stream(流)是一个来自数据源(可以是集合、数组、I/O channel 、产生器generator)的元素队列,可以更简洁的进行元素队列的内部迭代或聚合操作。
在Java中,集合接口可以通过stream()或者parallelStream()方法创建流,并通过forEach()、map()、sorted()等方法完成流数据的整体操作。