函数式接口
函数式接口:接口中有且仅有一个抽象方法,可以有其他的静态默认的方法,抽象方法只能有一个。
使用@functionalInterface注解修饰
检查是否是函数式接口
JAVA内置四大核心函数式接口
- Consumer : 消费型接口
-
Supplier : 供给型接口void accept(T t);
-
Function<T,R> : 函数型接口T.get();
-
Predicate : 断言型接口R apply(T t);
-
boolean test(T t)
lambda基础语法
操作符 ->将lambda表达式分成两部分
左侧:lambda的参数列表(抽象方法的参数列表)
右侧:lambda所需执行的功能,即lambda体(对抽象方法的实现)
语法格式
格式一:无参数,无返回值
-
() -> system.out.println("hello")
格式二:有一个参数,并且无返回值
-
(c) -> System.out.println(c)
格式三: 若只有一个参数,小括号可以不写
-
c -> System.out.println(c)
格式四: 有两个以上参数,有返回值,且lambda体中有多条语句
Comparator<Integer> com = (o1, o2) -> {
System.out.println("函数式接口");
return Integer.compare(o1,o2);
};
格式五:若lambda体中只有一条语句,return 和大括号都可以省略不写
-
Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
格式六:lambda 表达式的参数列表的数据类型可以省略不写,因为
jvm编译器通过上下文推断出数据类型,即类型推断
总结: 左右遇一括号省,左侧推断类型省
在局部内部类中应用一个同级别的局部变量
JDK1.7之前必须是final的
JDK1.8之后final可以不加但它还是final的
方法引用
方法引用:若lambda体中的内容有方法已经实现了,我们可以使用方法引用(方法引用lambda表达式的另一种形式)
语法格式:
实例 ::实例方法名
@Test
public void test2(){
BiPredicate<String,String> bp = (x,y) -> x.equals(y);
BiPredicate<String,String> bp2 = String::equals;
}
类名 ::静态方法名
@Test
public void test1(){
//类名:: 静态方法名
Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
Comparator<Integer> com1 = Integer::compareTo;
}
类名 ::实例方法名
@Test
public void test(){
//实例::实例方法名
Consumer<String> con = (x) -> System.out.println(x);
Consumer<String> con1 = System.out::println;
}
注意事项:
1 lambda体中调用方法的参数列表和返回值类型,要与函数式接口中抽象方法的参数列表与返回值类型保持一致
2 若lambda参数列表中的第一个参数是实例方法的调用者,第二个参数是实例方法的参数时可以使用类名::实例方法
构造器引用
格式:类名 ::new
@Test
public void test3(){
Supplier<Student> sup = () -> new Student();
//构造器引用
Supplier<Student> sup2 = Student::new;
Student student = sup2.get();
System.out.println(student);
}
注意:需要调用的构造器参数列表,要与函数式接口中抽象方法的参数列表保持一致
数组引用
格式:Type[] ::new
//数组引用
@Test
public void Test4(){
Function<Integer,String[]> fun = length -> new String[length];
String[] arr = fun.apply(5);
System.out.println(Arrays.toString(arr));
Function<Integer,String[]> fun1 = String[]::new;
String[] arr1 = fun1.apply(2);
System.out.println(Arrays.toString(arr1));
}