【Java】 Java 中函数式接口的使用

news2024/11/13 18:27:04

本文仅供学习参考!

相关教程地址:

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

https://www.cnblogs.com/dgwblog/p/11739500.html

https://www.developer.com/java/java-functional-interfaces/

在这里插入图片描述

接口是定义一组方法及其签名的契约。任何类都可以扩展该接口并实现该接口的方法。Java 编程语言从该语言的最早版本开始就提供了对接口的支持。

函数式接口是 Java 的一个流行功能,在版本 8 中添加到Java语言中。它们允许开发人员将函数创建为一流对象,这为创建可重用代码和简化开发过程开辟了新的可能性。

本文将介绍函数式接口、它们如何工作、它们为何有用,以及开发人员如何在项目中使用它们的一些示例。

Java 中的函数式接口是什么?

Java 中的函数式接口是仅由一个抽象方法(即未实现的方法)组成的接口。尽管此方法必须有返回类型,但它不能接受参数。该方法还必须是公共的并且位于可访问的类或接口中。

除了一种抽象方法之外,您还可以在 Java 的函数式接口中创建以下方法:

  • 默认方法
  • 静态方法
  • 从Object类继承的方法

下面是 Java 函数式接口的简单代码示例:

@FunctionalInterface 
public interface MyFunctionalInterface 
{ 
  void doSomething(); 
} 

如您所见,该接口只有一个抽象方法。

如何用 Java 编写比较器接口

函数式接口的一个常见示例是Comparator接口,它用于比较两个对象。它有以下抽象方法:

int compare(T obj1, T obj2); 
Here's how the Comparer interface is defined in Java: 
@FunctionalInterface
public interface Comparator {
	int compare(T o1, T o2);
	boolean equals(Object obj);
	//其他方法...
}

Comparator接口可用于按对象的自然顺序或您定义的自定义顺序对对象列表进行排序**。例如,程序员可以使用Comparator**接口按字符串的长度对字符串列表进行排序:

List listStrings = Arrays.asList("ABC", "XYZ", "PQR"); 
listStrings.sort((s1, s2) -> s1.length() - s2.length());
System.out.println(listStrings);

您还可以颠倒列表的顺序:

listStrings.sort((s1, s2) -> s2.length() - s1.length());
System.out.println(listStrings);

Java中的@FunctionalInterface注解

在 Java 8 中,注释**@FunctionalInterface**将接口标记为函数式接口。如果您的接口包含多个抽象方法,您可以使用此注释来标记接口以生成编译器错误。Java 中的函数式接口经常在lambda 表达式中使用,它可以有多个默认方法。

需要注意的是,注解**@FunctionalInterface是可选的。如果一个接口包含一个抽象方法但没有@FunctionalInterface**注解,那么它仍然是一个函数式接口,并且可能是 lambda 表达式的目标类型。该注释可以防止我们错误地将函数式接口修改为非函数式接口,因为编译器会标记错误。

Java 中函数式接口有哪些好处?

函数式接口最显着的好处是,它们可以创建多个类可以使用的抽象,而无需复制和粘贴代码。当开发人员需要使用各种方法和行为创建复杂的抽象时,这尤其有用。

在 Java 中,使用函数式接口,程序员可以将函数作为参数而不是引用对象传递,这减少了必须编写的样板代码量。

函数式编程中,一段代码可以被视为数据。这就是 lambda 表达式发挥作用的地方。您可以使用 lambda 表达式将代码传递给另一个函数或对象。

应该注意的是,lambda 表达式使用函数式接口作为数据类型。因为函数式接口中只有一个抽象方法,所以该方法的实现就成为可以作为参数传递给另一个方法的代码。

使用匿名内部类实现函数式接口

如下代码示例所示,在 Java 8 之前,程序员使用匿名内部类或对象来实现此类接口:

class Test {
    public static void main(String args[])
    {
        new Thread(new Runnable() {
            @Override public void run()
            {
                System.out.println("Hello World!");
            }
        }).start();
    }
}

Java 中的内置函数式接口

除了ComparatorRunnable接口之外,Java 8 中还有许多其他内置的函数式接口,例如CallablePredicateFunctionConsumer。这些接口可以在java.util.function包中找到。

下面简单讨论一下Java中最常用的内置接口:

  • 比较器比较器是一个接口,用于根据特定标准比较两个对象。java.util.Comparator类用于实现该接口。
  • Runnable:它是一个抽象类,实现Runnable接口并提供运行线程的抽象。
  • Callable:它表示一个返回单个结果值T的任务,可以通过调用其**call()**方法来访问该结果值。
  • FutureFuture表示一个异步操作,其结果可能尚不可用,但最终将在未来某个时间点(当所有挂起的活动已成功或不成功完成时)变得可用。
  • 供应商供应商只是一个返回值而不接受输入参数的函数;这些也称为纯函数
  • PredicatePredicate功能接口表示对于由布尔参数类型T指定的某些条件返回truefalse的谓词。
  • ConsumerConsumer函数接口表示接受T类型参数且不返回结果的函数。

如何用 Java 实现自定义功能接口

函数式接口可以通过两种方式创建:通过添加**@FunctionalInterface注解,可以将现有接口转换为函数式接口。或者,程序员可以拥有一个仅包含一个抽象方法的接口。以下代码示例是一个完整的示例,说明了如何在 Java 中定义和使用函数式接口:**

@FunctionalInterface  
    interface Test{  
        void display(String message);  
    }  
    public class TestImplementation implements Test{  
        public void display(String message){  
            System.out.println(message);  
        }  
        public static void main(String[] args) {  
            TestImplementation obj = new TestImplementation();  
            obj.display("Hello World!");  
        }  
    }

END

Java 8 中引入的 lambda 表达式比早期版本提供了新的语法改进,并有助于消除应用程序中的样板代码。函数式接口是 Java 的一等公民,它们的实现可以被视为 lambda 表达式。函数式接口通过减少匿名内部类的冗长性,使编写函数式代码变得更加容易。

函数式接口是为代码添加灵活性的好方法。通过使用功能接口,编码人员可以准确指定您需要从对象中获得哪些功能,然后让该对象由满足您的要求的任何类实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/690583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第五章 密码学基础上)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、密码学概述1、密码学的历史2、密码学的基本术语 二、密码学基本概念1、基本概念2、密码系统的安全性3、密码体制的分类4、密码体制的攻击 三、古典密码学四、对称密码算法…

Debezium系列之:监控 Debezium 实例

Debezium系列之:监控 Debezium 实例 一、概述二、实现步骤三、执行四、打开Grafana UI五、关闭集群 Debezium JMX相关的技术博客: Debezium系列之:安装jmx导出器监控debezium指标Debezium系列之:为Debezium集群JMX页面增加监控&a…

UE4/5动画系列(4.足部ik制作)

目录 前期准备 添加虚拟骨骼 ​编辑 腿部函数: 前肢: ​编辑 盆骨函数: 后肢: 进入动画图表: 前期准备 首先准备一个后期处理动画蓝图 然后【因为笔者之前的大象因为不知明原因崩溃,这里就不展示如何…

蓝桥杯专题-试题版-【圆的面积】【字符串对比】【字母图形】【核桃的数量】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

如何用机器学习做淘宝用户画像分析?

用户画像,即用户信息标签化,就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后,完美抽象出一个用户的商业全貌是企业应用大数据技术的基本方式。 用户画像为企业提供了足够的信息基础,能够帮助企业…

ChatGPT最新版带来的多功能批量写作工具激发您的创作

随着人工智能的不断发展,ChatGPT最新版作为一款多功能批量写作工具,为创作者们带来了前所未有的创作体验。它能够通过自然语言处理和机器学习技术,生成高质量的文章、故事、对话等内容,为创作者们提供了无限的创作灵感和可能性。本…

MFC 用Stream读取资源里PNG资源 告别exe文件需要资源跟着

在资源视图里添加资源 导入PNG资源 会自动新建一个PNG的文件夹 这时候 PNG就已经在资源里了 但是CImage只能通过路径或者流的方式来加载 不能根据ID值 我们就自己写个方法 声明 bool LoadImageFromResource(IN CImage * pImage, IN UINT nResID, IN LPCSTR lpTyp);实现 bo…

蓝桥杯专题-试题版-【数列排序】【数列特征】【特殊的数字】【特殊回文数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

Unity 桌面精灵+鼠标穿透

透明功能shader: Shader "Custom/MakeTransparent" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}_TransparentColorKey ("Transparent Color Key", Color) = (0,1,0,1)_TransparencyMargin ("Transparency Margin&qu…

Spring Boot中的@GetMapping注解,如何使用

Spring Boot中的GetMapping注解 介绍 Spring Boot是一个流行的Java框架,它提供了许多方便的注解和工具,使得Web应用程序的开发变得更加容易。其中,GetMapping注解是Spring Boot中最常用的注解之一,它可以帮助开发者定义和处理HT…

C# 多张图片合成一张PDF

我是将每张图片转为byte[],再将所有的字节数组转为byte[][],然后对byte[][]进行的处理,大家有其他格式的图片要进行处理的可以先转为上述数据格式。 语种:C# 用到的第三方库:PdfSharp.dll(可直接使用PDFsharp包)&…

C++11右值引用

目录 概念左值和右值左值引用和右值引用 使用左值引用右值引用和移动语义 完美转发万能引用完美转发 概念 左值和右值 左值 左值是一个可以被取地址、修改的对象或变量,其具有固定的内存地址。 左值可以出现在赋值语句的左边,因为它们表示一个可被修…

rabbitmq安装步骤和遇到的问题

一、安装准备工具 1.下载Eralng,下面链接已提供otp_win64_20.2.exe 链接: https://pan.baidu.com/s/1lmvCMPVAV1Ba9UogCdQpZg 提取码:x9m7 2.下载rabbitmq,下面链接已提供rabbitmq-server-3.7.4.exe 链接: https:…

CentOS安装supervisor管理rocketmq进程

一、supervisor 介绍 Supervisor 翻译过来是监管人,在 Linux 中 Supervisor 是一个进程管理工具,当进程中断的时候 Supervisor 能自动重新启动它。可以运行在各种类 Linux/unix 的机器上,supervisor 就是用 Python 开发的一套通用的进程管理程…

【Qt】随记2:CV_Assert的用法

欢迎阅读本博文,本文主要记录Qt学习、工作中的一些注意点及相关笔记📃 希望记录的内容有帮助到你,也欢迎把你知道的分享给大家,一起进步!🎉 喜欢的话,请帮忙点赞👍、评论&#x1f4…

STM32开发指南:逐步揭开嵌入式世界的奥秘

想要深入嵌入式开发领域?掌握STM32这本"天书"?也许你觉得它难以捉摸,但是别担心!我们为你准备了一份简洁明了的指南,将带你逐步解读STM32的奥秘。 首先,我们将介绍STM32的基础知识。从了解STM32…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第六章 身份认证与访问控制)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、身份认证1、身份认证概述2、身份认证常用技术3、常用身份认证机制 二、访问控制1、访问控制概述2、访问控制基本要素 三、访问控制类型四、访问控制机制 一、自学网络安全…

git 常见错误解决

一、git命令运行时出现以下错误提示: git add -A fatal: detected dubious ownership in repository at D:/****/WWW/www.***.cc D:/**/WWW/www.**.cc is owned by:S-1-5-32-544 but the current user is:S-1-5-21-4097290046-3821524887-*****-1001 To add an exce…

B站 Java相关学习资源汇总

一、计算机网络 计算机网络微课堂 https://www.bilibili.com/video/BV1c4411d7jb?p1 讲师:湖科大教书匠 评价:通俗易懂,重点知识十分细致,配合实验,而且有考研408 的难题的讲解,也是非常适合考研党&#…

QT树的实现

理论 在Model/View结构中,数据模型为视图组件和代理组件提供存取数据的标准接口。在QT中,所有的数据模型类都从QAbstactItemModel继承而来,不管底层的数据结构是如何组织数据的,QAbstractItemModel的子类都以表格的层次结构表示数…