概述
Lambda匿名函数
语法:
@Test
public void test(){
Runnable runnable = () -> {
System.out.println("hi");
};
}
格式:
->操作符 :lambda操作符
->操作符的左边是形参列表
->操作符的右边是函数体
函数式接口
如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。
- 函数式接口的使用场景:用Lambda表达式创建该函数式接口的实例
- 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。
- 以前用匿名实现类表示的都可以用Lambda完成
Java内置四大核心函数式接口
- 对应了四种场景(是否有返回值、返回类型等)
- 当Lambda表达式与函数式接口场景相同时,可以考虑采用函数式接口
方法引用
方法引用就是Lambda表达式,也是函数式接口的一个实例
也就是说,我们可以直接引用已实现的方法(参数列表得一致),来做类同的功能
格式:
类(或对象) : : 方法名
// 类 :: 方法
//Comparator中的int compare(T t1,T t2)
//Integer中的int compare(T t1,T t2)
@Test
public void test3() {
Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);
System.out.println(com1.compare(12,21));
System.out.println("*******************");
Comparator<Integer> com2 = Integer::compare; // 方法引用
System.out.println(com2.compare(12,3));
}
- 发现com1的匿名表达式实现的功能在Integer类中,已经有compare方法实现了,所以这里可以使用方法引用。
接口的增强
当多个类实现一个接口的某个方法时,方法的具体实现代码相同,这样就会造成代码重复问题。接口增强就相当于把公共的代码抽离出来,放入接口定义中
增强接口中可以有属性,可以有抽象方法,也可以有具体的方法
interface MyInterface {
public void print();
// default 和 static 方法的出现为了解决实现该接口的子类代码重复的问题
default void defaultMethod() {
System.out.println("default method invoked! ");
}
static void staticMethod() {
System.out.println("static method invoked! ");
}
}
- 接口中定义具体的方法实现是有限制的,它只能定义default和static类型的方法。
Stream API
java8提供了一套api,使用这套api可以对集合的数据进行过滤、排序、映射、归约等操作。
Optional
Optional
- Optional的作用是可以避 免空指针异常,并且给出了针对空指针的处理。