概述
它允许我们将一段代码(这段代码可以理解为一个接口的实现)当成参数传递给某个方法,然后进行业务处理。
一种函数式编程风格,通过底层的类型推断,方法引用等特性
应用于迭代操作,映射操作,聚合操作等。
函数式接口:只有一个抽象方法,可以用@FunctionalInterface检查
使用方法
函数式接口 interface
方法:method(params p,interface< T> i){
i.function§
}
调用方法:method(params,lambda表达式:(params)->{})
相当于:interface< T> i=lambda表达式:(params)->{};
i.function§;
快速入门分析
由逗号分隔的参数列表 -> 语句块
参数:显示指定或编译器推理:一个时可以省略括号
返回值类型由编译器推理
语句块只有一行,省略花括号和return
常见结构
() -> statement
arg -> statement
(arg) -> statement
(arg1, arg2, ...) -> { body-block }
(Type1 arg1, Type2 arg2, ...) -> {
method-body-block;return value;
}
内置四大核心函数式接口
- Consumer< T>:消费型接口
void accept(T t); - Supplier< T>:供给型接口
T get(); - Function<T,R>:函数型接口
R apply(T t); - Predicate< T>:断言型接口
boolean test(T t);
上述接口还有子接口,用于适用参数、返回值不同的情况。
应用案例增强实现
- 传统线程简化
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
}).start();
new Thread(()->{
System.out.println("hello");
}).start();
- 简化排序
String[] strArray= {"abcd","ab","abc"};
Arrays.sort(strArray,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});
String[] strArray= {"abcd","ab","abc"};
Arrays.sort(strArray, (s1, s2) -> s1.length() - s2.length());
方法引用
接口的方法实现用已有的方法替代
前提:参数列表和返回值类型一致
- 对象::实例方法名
例如:System.out::println;
student::getName; - 类::静态方法名
例如:Integer::compare; - 类::实例方法名(需要:参数列表第一参数是实例方法的调用者,第二参数是实例方法的参数)
例如:String::equals;
构造器引用
ClassName::new
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致
例如:Studnet::new
数组引用
Type::new;
例如:String[]::new;