Lambda下的函数式接口参数都是啥?

2018-11-30  本文已影响0人  水云楼

前面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包下:

上一篇下一篇

猜你喜欢

热点阅读