Lambda表达式是JAVA 1.8才开始有的重要功能,使用Lambda表达式可以替代匿名内部类,代码简洁易懂,提升工作效率。上代码:
使用内部类和使用lambda实现代码量对比
有且只有一个抽象方法(可以包含default或static方法,但Object类除外)的接口是函数式接口。@FunctionlInterface就是用来指定某个接口必须是函数式接口。@FunctionalInterface不是必须的,只是告诉编译器检查这个接口,保证该接口只能包含一个抽象方法,否则就会编译出错。@FunctionalInterface主要是帮助程序员避免一些低级错误,比如多个抽象方法。
java.util.Comparator //排序接口
java.lang.Runnable //线程无返回值接口
java.util.concurrent.Callable<V> //线程有返回值接口
java.lang.reflect.InvocationHandler //动态代理接口
等等......
Java1.8函数式接口都在rt.jar的java.util.function包中,以下是经常用到的函数式接口(一定要熟记,其他的函数式接口都是在这些函数式接口上的扩展
):
名称 |
唯一抽象方法 |
备注 |
Consumer< T > |
void accept(T t); |
接收一个参数,无返回值,即数据消费接口 |
Predicate< T > |
boolean test(T t); |
接收一个参数,返回布尔值,即数据判断接口 |
Supplier< T > |
T get(); |
无参数,有返回值,即数据获取接口 |
Function< T, R > |
R Apply(T t); |
接收T类型参数,返回R类型结果,即数据映射接口(一般输入和输出是不同类型的)
|
BiConsumer<T, U> |
void accept(T t, U u); |
接收两个输入,无返回值,数据消费接口 |
UnaryOperator<T> extends Function<T, T>
|
T accept(T t); |
接收一个参数,有返回值,输入和输出是相同类型,即数据映射接口 |
BiFunction<T, U, R>
|
R apply(T t, U u); |
接收2个输入,有返回值,输入和输出是不同类型,即数据映射接口 |
BinaryOperator<T> extends BiFunction<T,T,T>
|
T apply(T t, T u); |
接收2个输入,有返回值,输入和输出是相同类型,即数据映射接口 |
通过上面的学习我们已经知道函数式接口的定义和分类,接下来我们实战自定义函数式接口 。废话不多说,代码走起来。
代码示例1
代码示例2
代码示例3
@Test
public void testMyFuncationInterface() {
// 1.无参无返回值
IBossService boss = () -> System.out.println(" invoke m3");
boss.m3();
// 2.无参有返回值
IBossService3<String> boss3 = () -> "m3";
boss3.m3();
// 3.有参无返回值
IBossService2<String> boss2 = e -> System.out.println("param:" + e);
boss2.m3("lambda");
// 4.有参有返回值
IBossService4<String, Integer> boss4 = e -> 1;
boss4.m3("lambda");
}
@FunctionalInterface
interface IBossService {
static int m2() {
return 2;
}
default void m1() {
System.out.println("m1");
}
void m3();
}
@FunctionalInterface
interface IBossService3<R> {
static int m2() {
return 2;
}
default void m1() {
System.out.println("m1");
}
R m3();
}
@FunctionalInterface
interface IBossService2<E> {
static int m2() {
return 2;
}
default void m1() {
System.out.println("m1");
}
void m3(E e);
}
@FunctionalInterface
interface IBossService4<T, R> {
static int m2() {
return 2;
}
default void m1() {
System.out.println("m1");
}
R m3(T t);
}