前面Optional的学习心得里提到
ifPresent()方法入参为 consumer 表达式,
orElseGet()方法入参为Supplier(供应者)表达式;
filter() 方法入参为Predicate(函数式接口)表达式;
map()方法内里执行的是Function函数调用。
不了解JDK1.8新特性的同学估计要犯嘀咕了,这些东东到底是个啥?我们进源码一窥究竟:
可以看出这几种表达式其实都是以@FunctionalInterface为注解的函数式接口。
使用@Functionallnterface注解的接口统称为函数式接口,那么什么是函数式接口呢?
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
可以改为:
Supplier<String> supplier = () -> "aaa";
supplier.get();
而上面四种函数式接口都表示什么意思呢?
Function<T, R> => R apply(T t); //接受一个输入参数T,返回一个结果 R
T-表示函数的输入类型
R-表示函数的输出类型
PS:通过这个函数可以做些类型转换的事情呦~
Function<Integer, String> function1 = (x) -> "输入了:"+ x;
System.out.println(function1.apply(7));
Predicate<T> => boolean test(T t); //接受一个输入参数T,返回一个布尔类型的结果
int[] shuzu = {1,2,3};
Predicate<int[]> predicate = (x) -> x.length > 0;
System.out.println(predicate.test(shuzu));
Consumer<T> => void accept(T t); //接受一个输入参数T,无返回值
Consumer<String> consumer = (x) -> System.out.println("使用了参数: " + x);
consumer.accept("aa");
Supplier<T> => T get(); //无输入参数,返回一个结果T
Supplier<String> supplier = () -> "aaa";
supplier.get();
函数式接口不光有上面提到的这四种,jdk1.8之前java就有了函数式接口了:
java.lang.Runnable;java.util.concurrent.Callable等,上面四种为1.8后新添加的接口,他们在java.util.function包下:
网友评论