Java8新特性【函数式接口】

一、什么是函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以被隐式转换为 lambda 表达式。

如定义了一个函数式接口如下:

@FunctionalInterface
interface GreetingService {
    void sayMessage(String message);
}

那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA8 之前一般是用匿名类实现的):

GreetingService greetService1 = message -> {System.out.println("Hello " + message);};

在Java8之前,常见的函数式接口有:

java.lang.Runnable
java.util.concurrent.Callable
java.util.Comparator
java.lang.reflect.InvocationHandler

二、Java8内置的四大函数式接口

在学习一段时间后会不会有这样的疑问:

难道我要用Lambda表达式的时候总要自己写函数式接口吗?

当然不是这样了,Java8里面提供了四大核心的函数式接口供我们使用,在符合业务要求的场景下,我们可以直接拿来使用。

函数式接口 参数类型 返回类型 用途
Consumer 消费型接口 T void 对类型为 T 的对象应用操作,包含方法: void accept(T t);
Supplier 供给型接口 T 返回类型为 T 的对象,包含方法:T get();
Function<T,R> 函数型接口 T R 对类型为 T 的对象应用操作,并返回结果。结果是 R 类型的对象。包含方法: R apply(T t);
Predicate 断定型接口 T boolean 确定类型为 T 的对象是否满足某约束,并返回 boolean 值。包含方法: boolean test(T t);

案例代码如下:

/**
  * @name 消费型接口
  * @use Consumer<T>
  * @param T 传入参数
  * @fun 接受一个参数 无返回值
* */
Consumer<String> con=(str)->System.out.println(str);
con.accept("我是消费型接口!");
/**
  * @name 供给型接口
  * @use Supplier<R>
  * @param R 返回值类型
  * @fun 无参数 有返回值
* */
// Supplier<Date> supp=()-> {return new Date();};
// 上面那一行代码可以修改为如下
Supplier<Date> supp=()-> new Date();
Date date=supp.get();
System.out.println("当前时间:"+date);
/**
 * @name 函数型接口
 * @use Function<T,R>
 * @param T 传入参数
 * @return R 返回值类型
 * @fun 接受一个参数 有返回值
* */
// Function<String, String> fun=str->{return "hello,"+str;};
// 上面那一行代码可以修改为如下
Function<String, String> fun=str->"hello,"+str;
String str=fun.apply("跑调大叔!");
System.out.println(str);
/**
 * @name 断定型接口
 * @use Predicate<T>
 * @param T 传入参数
 * @return Boolean 返回一个Boolean型值
 * @fun 接受一个参数 返回Boolean型值
* */
// Predicate<Integer> pre=num->{return num>0;};
// 上面那一行代码可以修改为如下
Predicate<Integer> pre=(num)->num>0;
Boolean flag=pre.test(10);
System.out.println(flag);

三、拓展函数式接口

如果觉得这四个内置的函数式接口还是不够用,那么可以参考下面的一些拓展的接口,其用法与上面大同小异:

https://www.runoob.com/java/java8-functional-interfaces.html

Java新手,若有错误,欢迎指正!

posted @ 2021-03-07 22:44  跑调大叔!  阅读(72)  评论(0编辑  收藏  举报