什么是函数式接口(Functional Interface)

其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法

这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。

函数式接口用途

它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

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

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

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

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

关于@FunctionalInterface注解

Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。

正确例子,没有报错

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

错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse报错提示其不是函数式接口。

提醒:加不加@FunctionalInterface对于接口是不是函数式接口没有影响,该注解知识提醒编译器去检查该接口是否仅包含一个抽象方法

函数式接口里允许定义默认方法

函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;

如下代码不会报错:

    @FunctionalInterface
interface GreetingService
{
void sayMessage(String message); default void doSomeMoreWork1()
{
// Method body
} default void doSomeMoreWork2()
{
// Method body
}
}

函数式接口里允许定义静态方法

函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;

如下代码不会报错:

    @FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
static void printHello(){
System.out.println("Hello");
}
}

函数式接口里允许定义java.lang.Object里的public方法

函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现;

如下代码不会报错:

    @FunctionalInterface
interface GreetingService
{
void sayMessage(String message); @Override
boolean equals(Object obj);
}

JDK中的函数式接口举例

java.lang.Runnable,java.awt.event.ActionListener, java.util.Comparator,java.util.concurrent.Callable

java.util.function包下的接口,如ConsumerPredicateSupplier

java.util.function 提供的函数式接口汇总

java.util.function包中所有的接口整理:

Function

表示一个方法接收参数并返回结果。

接收单个参数

Interface functional method 说明
Function<T,R> R apply(T t) 接收参数类型为T,返回参数类型为R
IntFunction R apply(int value) 以下三个接口,指定了接收参数类型,返回参数类型为泛型R
LongFunction R apply(long value)
Double R apply(double value)
ToIntFunction int applyAsInt(T value) 以下三个接口,指定了返回参数类型,接收参数类型为泛型T
ToLongFunction long applyAsLong(T value)
ToDoubleFunction double applyAsDouble(T value)
IntToLongFunction long applyAsLong(int value) 以下六个接口,既指定了接收参数类型,也指定了返回参数类型
IntToDoubleFunction double applyAsLong(int value)
LongToIntFunction int applyAsLong(long value)
LongToDoubleFunction double applyAsLong(long value)
DoubleToIntFunction int applyAsLong(double value)
DoubleToLongFunction long applyAsLong(double value)
UnaryOperator T apply(T t) 特殊的Function,接收参数类型和返回参数类型一样
IntUnaryOperator int applyAsInt(int left, int right) 以下三个接口,指定了接收参数和返回参数类型,并且都一样
LongUnaryOperator long applyAsInt(long left, long right)
DoubleUnaryOperator double applyAsInt(double left, double right)

接收两个参数

interface functional method 说明
BiFunction<T,U,R> R apply(T t, U u) 接收两个参数的Function
ToIntBiFunction<T,U> int applyAsInt(T t, U u) 以下三个接口,指定了返回参数类型,接收参数类型分别为泛型T, U
ToLongBiFunction<T,U> long applyAsLong(T t, U u)
ToDoubleBiFunction<T,U> double appleyAsDouble(T t, U u)
BinaryOperator T apply(T t, T u) 特殊的BiFunction, 接收参数和返回参数类型一样
IntBinaryOperator int applyAsInt(int left, int right)
LongBinaryOperator long applyAsInt(long left, long right)
DoubleBinaryOperator double applyAsInt(double left, double right)

Consumer

表示一个方法接收参数但不产生返回值。

接收一个参数

interface functional method 说明
Consumer void accept(T t) 接收一个泛型参数,无返回值
IntConsumer void accept(int value) 以下三个类,接收一个指定类型的参数
LongConsumer void accept(long value)
DoubleConsumer void accept(double value)

接收两个参数

interface functional method 说明
BiConsumer<T,U> void accept(T t, U u) 接收两个泛型参数
ObjIntConsumer void accept(T t, int value) 以下三个类,接收一个泛型参数,一个指定类型的参数
ObjLongConsumer void accept(T t, long value)
ObjDoubleConsumer void accept(T t, double value)

Supplier

返回一个结果,并不要求每次调用都返回一个新的或者独一的结果

interface functional method 说明
Supplier T get() 返回类型为泛型T
BooleanSupplier boolean getAsBoolean() 以下三个接口,返回指定类型
IntSupplier int getAsInt()
LongSupplier long getAsLong()
DoubleSupplier double getAsDouble()

Predicate

根据接收参数进行断言,返回boolean类型

interface functional method 说明
Predicate boolean test(T t) 接收一个泛型参数
IntPredicate boolean test(int value) 以下三个接口,接收指定类型的参数
LongPredicate boolean test(long value)
DoublePredicate boolean test(double value)
BiPredicate<T,U> boolean test(T t, U u) 接收两个泛型参数,分别为T,U

【Java 8】函数式接口(一)—— Functional Interface简介的更多相关文章

  1. 函数式接口(Functional Interface)

    原文链接:https://www.cnblogs.com/runningTurtle/p/7092632.html 阅读目录 什么是函数式接口(Functional Interface) 函数式接口用 ...

  2. JAVA 8 函数式接口 - Functional Interface

    什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法. 这种类型的接 ...

  3. Java 8函数式接口functional interface的秘密

    Java 8函数式接口functional interface的秘密 2014年10月29日 17:52:55 西瓜可乐520 阅读数:3729   目录 [−] JDK 8之前已有的函数式接口 新定 ...

  4. Java 8 函数式接口

    函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式. Lambda 表达式和方法引用 ...

  5. Java 8 新特性-菜鸟教程 (3) -Java 8 函数式接口

    Java 8 函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为lambda表达式. 函数式接 ...

  6. Java之函数式接口@FunctionalInterface详解(附源码)

    Java之函数式接口@FunctionalInterface详解 函数式接口的定义 在java8中,满足下面任意一个条件的接口都是函数式接口: 1.被@FunctionalInterface注释的接口 ...

  7. Java之函数式接口

    函数式接口 概述:接口中只有一个抽象方法 下面介绍的可能很抽象,理解不了,至少在我看来单独的这几个借口是没有用的,跟最下面说的 Stream流一起用才会有效果 函数式接口,即适用于函数式编程场景的接口 ...

  8. Java常用函数式接口--Consumer接口andThen()方法使用案例(二)

    Java常用函数式接口--Consumer接口使用案例

  9. Java常用函数式接口--Predicate接口使用案例

    Java常用函数式接口--Predicate接口使用案例 该方法可以使用and来优化: 调用:

随机推荐

  1. PTA 7-3 树的遍历 (25分)

    PTA 7-3 树的遍历 (25分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点 ...

  2. grep命令详解与正则表达式

    grep命令主要是做什么的呢 ?下面我们就来研究下. grep命令简单来说就是"过滤".就是把想看的数据通过grep过滤出来,把不想看的通过grep过滤掉. 它是一种强大的文本搜索 ...

  3. [python]django rest framework写POST和GET接口

    版本声明 python3.6.5 Django-2.0.6 djangorestframework-3.8.2 mysqlclient-1.3.12 1.写一个登录接口,不多说,直接上代码 login ...

  4. 第一天 python入门 基础 “”“Hello World”和if-elif的使用、数据类型

    (1)第一个程序"""Hello World" 实现python环境打印输出:Hello World 程序: print("Hello World&q ...

  5. F5 BIG-IP 远程代码执行RCE(CVE-2020-5902)复现

    漏洞简介 F5 BIG-IP 是美国``F5公司一款集成流量管理.DNS.出入站规则.web应用防火墙.web网关.负载均衡等功能的应用交付平台. 在F5 BIG-IP产品的流量管理用户页面 (TMU ...

  6. Django笔记&教程 4-1 模型(Models)介绍

    Django 自学笔记兼学习教程第4章第1节--模型(Models)介绍 点击查看教程总目录 参考:https://docs.djangoproject.com/en/2.2/topics/db/mo ...

  7. 【linux系统】命令学习(六)awk sed grep 与管道的使用

    程序运行环境输入与输出 标准输入0 read a;echo $a 标准输出1 echo cesh 错误输出 ls notr 管道重定向 管道与管道之间可以重定向 管道与文件之间可以重定向 用于写入 将 ...

  8. 编译使用nginx

    nginx-1.18.0 ./configure --prefix=$HOME/nginx --with-http_ssl_module make -j32; make install [fangju ...

  9. [hdu6581]Vacation

    首先发现,最终第0辆车一定被堵在某一辆车前,那么等价于它的初始位置就在(那辆车的位置+中间车的车长)/那辆车的速度,其中最大的那个就是答案因此得出结论:$ans=max((\sum_{j=1}^{i} ...

  10. [gym102832J]Abstract Painting

    考虑每一个圆即对应于区间$[x_{i}-r_{i},x_{i}+r_{i}]$,可以看作对于每一个区间,要求所有右端点严格比其小的区间不严格包含左端点 用$f_{i}$表示仅考虑右端点不超过$i$的区 ...