热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java8新特性|四大函数式接口及其扩展接口

本文源码:Gitee点这里什么是函数式接口在介绍他们之前,我们先看看什么是函数式接口。先打开API文档,查看FunctionalInte

本文源码:Gitee·点这里



什么是函数式接口

在介绍他们之前,我们先看看什么是函数式接口。先打开API文档,查看FunctionalInterface的介绍。

FunctionalInterface

API中介绍可以看出:


  • @FunctionalInterface是一个注解,旨在声明接口类型为函数式接口,切只能加在接口上。
  • 函数式接口只允许有一个抽象方法
  • 可以包含使用default声明的方法,因为该方法为普通方法(Java8以后允许在接口中使用default声明一个普通方法)
  • 可以使用Lambada表达式创建函数式接口的实例

注:如果接口符合函数式接口的要求,即使不加@FunctionalInterface注解也会被视为函数式接口


四大函数式接口有哪些

java.util.function包的介绍可以看出,Java有四大函数式接口,分别为FunctionConsumerPredicateSupplier,我们来逐个介绍,相信看完后你会对函数式接口有更深的理解。

java.util.function


Function 函数型接口

表示接收一个参数并返回结果的函数。该函数式接口方法为R apply(T t):


  • 为入参泛型

  • 为返回结果泛型


示例代码

示例1:函数式接口可以被new出一个实例来,必须实现其抽象接口

static void functionDemo1() {Function<Integer, String> function &#61; new Function<Integer, String>() {&#64;Overridepublic String apply(Integer integer) {return integer.toString() &#43; "程序员节";}};System.out.println("functionDemo1 --> " &#43; function.apply(1024));
}

示例2&#xff1a;可以使用Lambada表达式简化函数式接口

static void functionDemo2() {Function<Integer, String> function &#61; (integer) -> {return integer.toString() &#43; "程序员节";};System.out.println("functionDemo2 --> " &#43; function.apply(1024));
}

示例3&#xff1a;Lambada表达式入参只有一个时&#xff0c;可以不加小括号&#xff1b;
方法体内只有一行代码时可以不加大括号和 return 关键字&#xff0c;直接编写返回结果即可

static void functionDemo3() {Function<Integer, String> function &#61; integer -> integer.toString() &#43; "程序员节";System.out.println("functionDemo2 --> " &#43; function.apply(1024));
}

示例4&#xff1a;函数式接口做为方法的入参

static void functionDemo4(Integer integer, Function<Integer, String> function) {System.out.println("functionDemo4 --> " &#43; function.apply(integer));
}public static void main(String[] args) {functionDemo4(1024, integer -> integer.toString() &#43; "程序员节");
}

Predicate 断定型接口

表示接收一个参数&#xff0c;判断该参数是否满足某约束&#xff0c;并返回boolean值。该函数式接口方法为boolean test(T t)


  • 为入参泛型
  • 返回boolean型值

示例代码

示例1&#xff1a;new一个Predicate实例

static void predicateDemo1() {Predicate<Integer> predicate &#61; integer -> integer &#61;&#61; 1024;System.out.println("predicateDemo1 --> " &#43; predicate.test(1024));
}

示例2&#xff1a;Predicate做为方法的入参

static void predicateDemo2(Integer integer, Predicate<Integer> predicate) {System.out.println("predicateDemo1 --> " &#43; predicate.test(integer));
}public static void main(String[] args) {predicateDemo2(1024, integer -> integer &#61;&#61; 1024);
}

Consumer 消费型接口

接收一个参数但不返回结果&#xff0c;表示为消费者。该函数式接口方法为void accept(T t)


  • 为入参泛型

示例代码

示例1&#xff1a;new一个Consumer实例

static void consumerDemo1() {Consumer<Integer> consumer &#61; integer -> System.out.println("consumerDemo1 --> " &#43; integer);consumer.accept(1024);
}

示例2&#xff1a;Consumer 作为方法的入参

static void consumerDemo2(Integer integer, Consumer<Integer> consumer) {consumer.accept(integer);
}public static void main(String[] args) {consumerDemo2(1024, integer -> System.out.println("consumerDemo2 --> " &#43; integer));
}

Supplier 供给型接口

Consumer相反&#xff0c;Supplier只有返回结果&#xff0c;表示为提供者。该函数式接口方法为T get()


  • 为返回结果泛型

示例代码

示例1&#xff1a;new一个Supplier实例

static void supplierDemo1() {Supplier<Integer> supplier &#61; () -> 1024;System.out.println("supplierDemo1 --> " &#43; supplier.get());
}

示例2&#xff1a;Supplier作为方法的入参

static void supplierDemo2(Supplier<Integer> supplier) {System.out.println("supplierDemo2 --> " &#43; supplier.get());
}public static void main(String[] args) {supplierDemo2(() -> 1024);
}

四大函数式接口总结

为了便于记忆&#xff0c;我们对四大函数式接口进行一个总结&#xff1a;


函数式接口接口类型参数类型返回类型方法
Function函数型接口TRR apply(T t)
Predicate断定型接口Tbooleanboolean test(T t)
Consumer消费型接口Tvoidvoid accept(T t)
Supplier供给型接口TT get()

其他函数式接口&#xff08;扩展&#xff09;

java.util.function包下还包含了其他函数式接口供我们使用&#xff0c;也是对这四大函数式接口进行的一个扩展


函数型接口


函数式接口参数类型返回类型方法用途
BiFunctionT,URR apply(T t, U u)接收两个输入参数并产生结果
ToIntBiFunctionT,Uintint applyAsInt(T t,U u)接收两个输入参数并返回int类型结果
ToLongBiFunctionT,Ulonglong applyAsLong(T t, U u)接收两个输入参数并返回long类型结果
ToDoubleBiFunctionT,Udoubledouble(T t, U u)接收两个输入参数并产生double类型结果
ToIntFunctionTintint applyAsInt(T value)接收一个参数并返回int类型结果
ToDoubleFunctionTdoubledouble applyAsDouble(T value)接收一个参数并返回double类型结果
IntFunctionintRR apply(int value)接收一个int类型参数&#xff0c;并返回结果
LongFunctionlongRR apply(long value)接收一个long类型参数&#xff0c;并返回结果
DoubleFunctiondoubleRR apply(double value)接收一个double类型参数&#xff0c;并返回结果
IntToDoubleFunctionintdoubledouble applyAsDouble(int value)接收一个int类型参数&#xff0c;返回double类型结果
LongToDoubleFunctionlongdoubledouble applyAsDouble(long value)接收一个long类型参数&#xff0c;返回double类型结果
LongToIntFunctionlongintint applyAsInt(long value)接收一个long类型参数&#xff0c;返回int类型结果
IntToLongFunctionintlonglong applyAsLong(int value)接收一个int类型参数&#xff0c;返回long类型结果
DoubleToIntFunctiondoubleintint applyAsInt(double value)接收一个double类型参数&#xff0c;返回int类型结果
DoubleToLongFunctiondoublelonglong applyAsLong(double value)接收一个double类型参数&#xff0c;返回long类型结果
BinaryOperatorT,TTT apply(T t1, T t2)BiFunction的一个子接口&#xff0c;表示对同一类型的两个参数进行操作&#xff0c;产生同一类型的结果
UnaryOperatorTTT apply(T t)Function的一个子接口&#xff0c;表示对单个参数操作&#xff0c;产生同一类型的结果
LongBinaryOperatorlong,longlonglong applyAsLong(long left, long right)对两个long值计算并产生long结果
DoubleBinaryOperatordouble,doubledoubledouble applyAsDouble(double left, double right)对两个double值计算并产生double结果
IntUnaryOperatorintintint applyAsInt(int operand)对单个int值操作&#xff0c;产生一个int结果
LongUnaryOperatorlonglonglong applyAsLong(long operand)对单个long值操作&#xff0c;产生一个long结果
DoubleUnaryOperatordoubledoubledouble applyAsDouble(double operand)对单个double值操作&#xff0c;返回一个double结果
IntBinaryOperatorint,intintint applyAsInt(int left, int right)对两个int值计算并产生int结果

断定型接口


函数式接口参数类型返回类型方法用途
BiPredicateT,Ubooleanboolean test(T t, U u)接收两个输入参数&#xff0c;断定并返回boolean类型结果
IntPredicateintbooleanboolean test(int value)接收一个int参数值&#xff0c;断定并返回boolean类型结果
LongPredicatelongbooleanboolean test(long value)接收一个long类型参数&#xff0c;断定并返回boolean类型结果
DoublePredicatedoublebooleanboolean test(double value)接收一个double参数值&#xff0c;断定并返回boolean类型结果

消费型接口


函数式接口参数类型返回类型方法用途
BiConsumerT,Uvoidvoid accept(T t, U u)接收两个输入参数&#xff0c;不返回结果
ObjIntConsumerT,intvoidvoid accept(T t, int value)接收对象值和int类型参数&#xff0c;不返回结果
ObjLongConsumerT,longvoidvoid accept(T t, long value)接收对象值和long类型参数&#xff0c;不返回结果
ObjDoubleConsumerT,doublevoidvoid accept(T t, double value)接收对象值和double类型参数&#xff0c;不返回结果
LongConsumerlongvoidvoid accept(long value)消费long类型值&#xff0c;不返回结果
DoubleConsumerdoublevoidvoid accept(double value)消费double类型值&#xff0c;不返回结果
IntConsumerintvoidvoid accept(int value)消费int类型值&#xff0c;不返回结果

供给型接口


函数式接口参数类型返回类型方法用途
BooleanSupplierbooleanboolean getAsBoolean()表示供给boolean类型的结果
IntSupplierintint getAsInt()表示供给int类型的结果
LongSupplierlonglong getAsLong()表示供给long类型的结果
DoubleSupplierdoubledouble getAsDouble()表示供给double类型的结果

推荐阅读
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
author-avatar
鱼影沫1457
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有