Java 8中的功能接口是什么? @功能注释和示例

函数接口是Java 8最重要的概念之一,实际上为lambda表达式提供了动力,但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它,并花时间学习lambda表达式和Stream API。除非您知道什么是功能接口以及lambda与它之间的关系,否则您将无法使用Java 8的强大功能,例如lambda表达式和流API 。 没有功能接口的知识,您将无法理解在代码中可以使用lambda的位置,但是您将很难编写该方法所期望的lambda表达式,因此,对功能接口有一个很好的了解非常重要。 Java 8。

在本文中,我将通过解释什么是函数接口,什么是@Functional注释,它们与lambda表达式之间的关系以及它们如何帮助您在代码中使用lambda表达式来填补这一空白。 那么,让我们从第一件事开始,什么是功能接口?

Java 8中的功能接口是什么

好的,功能接口不过是带有一个抽象方法的接口,例如ComparableRunnableEventListenerComparator等。您可以看到这些接口甚至在JDK 8之前就已经存在于Java中,但是为什么我们将这种接口称为功能接口呢?

这是一个很好的问题,如果您对函数式编程有所了解,就知道它可以传递代码,即函数,就像将数据或对象传递给方法一样。
这些接口只有一种抽象方法被用于传递代码,就像以函数式编程语言传递函数一样, 这就是为什么它们被称为函数接口

例如,您可以通过实现Comparator接口来创建一个Anonymous类,从而直接传递代码以比较对象,如下所示:

Collections.sort(list, new Comparator(){public int compare(String s1, String s2){return s1.length() - s2.length();}});

因此,如果仔细观察,您会发现我们正在使用这些接口将代码传递给函数 。 它们也称为策略接口,因为这是策略模式的实现,其中,构成策略的代码被注入到在运行时运行该策略的代码中。

顺便说一句,如果您不知道什么是策略模式,那么我建议您从0转到1:设计模式–至关重要的24 –在Java中 ,因为设计模式的知识对于Java的有效编码很重要。

那么,既然我们知道什么是功能接口,让我们了解它们与lambda表达式之间的关系 ,以及对功能接口的理解对于使用lambda表达式编写代码有何重要性?

好吧,要记住的最重要的事情是,Java中lambda表达式的唯一用途是将它们转换为功能接口。

这意味着如果方法接受函数接口则可以传递lambda表达式 ,这进一步意味着,可以将lambda传递给所有接受方法的现有方法
ComparatorRunnable或任何其他只有一种抽象方法的接口。

这就是Java中lambda表达式也被称为SAM类型的原因,其中SAM表示单一抽象方法。

@Functional注释有什么作用?

现在,让我们看看@Functional注释是做什么的? 如果仅在其上面添加@Functional注释,它将使接口起作用吗? 好吧,不,它不会那样做。 实际上,
可选的

这意味着您可以在不使用@Functioanl批注的情况下创建功能接口,就像可以在不将@Override批注放在方法顶部的情况下@Override方法一样。 那么, @Functional注释的真正目的是什么?

好吧,它可以确保该接口实际上只有一种抽象方法,并且还向Javadoc之类的工具提供了此接口是功能性接口的提示。 它与@Override注释非常相似,后者通过验证您实际上是重写方法来帮助防止人为错误。

@Override相似,它的最佳做法是使用单个抽象方法将@Functional批注放在方法的顶部,以向Javadoc等工具表明它们是功能接口。

@Functional注释对java.util.function包中添加的所有新功能接口进行注释。

顺便说一句,是的,我们在JDK 8中提供了更多的功能接口,特别是通用功能接口,例如PredicateSupplierConsumerFunctionBiFunctionUnaryOperator等。请参见
Java 8:初学者的基础知识,可深入了解所有这些接口。

这些功能接口允许您以lambda表达式的形式将代码传递给函数,并允许创建可以对这些代码进行操作的强大方法,例如
filter()接受谓词,并允许您传递接受一个参数并返回布尔值的代码。

功能接口和Lamda表达式如何关联

功能接口的知识如何影响lambda表达式的编写? 好吧,除非您不了解功能接口,否则您将无法编写可转换为该功能接口的lambda表达式。

例如, java.util.Map接口的merge()方法接受BiFunction,但是如果您不知道什么是BiFunction,则无法为此编写lambda。

BiFunction是一个功能接口,具有一个接受两个参数T和U并返回对象R的方法。

这意味着您可以将lambda传递给此方法,该方法可处理两个参数并返回一个对象,例如merge(key, value, (v1, v2) -> v1 + v2)这里(v1, V2) -> v1 + v2是一个可以转换为BiFunction功能接口实例的lambda表达式。

一个更简单的示例是Predicate ,它接受类型T并返回一个布尔值。 如果您看Stream类的filter()方法,它将接受一个谓词:

filter(Predicate predicate)

这意味着您可以传递任何接受一个参数的lambda表达式,然后将布尔值返回给该方法,例如age -> age > 15 or s -> s.length == 15 ,这两个都是可接受的,但是如果您不知道什么是a谓词接口,那么您将无法做到这一点。

功能接口的另一个示例是Consumer ,它接受类型T的参数并且不返回任何内容。 JDK 8中Iterable的forEach()方法很好地利用了这一点,如下所示:

forEach(Consumer action)

您会看到forEach()接受了Consumer,这意味着您可以向其传递一个lambda表达式,该表达式具有一个参数,不返回任何内容或返回空值,例如

s -> System.out.println(s)

代码System.out.println()返回任何内容,它仅在控制台中打印行。

您可以看到,如果您知道功能接口,则可以轻松编写lambda表达式以进行传递,因此必须对功能接口有充分的了解。 我建议您遍历java.util.function包中的所有功能接口并了解它们。

我将在以后的文章java.util.function包中的一些更复杂的功能接口,但是如果您迫不及待,那么我建议您学习此Java 9 Master Class课程,以了解有关Lambda和其他Java的更多信息。 8个概念。

这就是Java中的功能接口 。 您还了解了@Functional批注的作用以及为什么要对Java 8中的代码中的lambda表达式进行有效使用需要对功能接口有充分的了解。如果您尚未开始使用Java 8,建议您这样做。之所以这样做,是因为在未来几年中,每个人都将使用Java 8进行编码,如果您不知道lambda表达式和Java 8中引入的新功能,那么您将被抛在后面。

其他Java 8教程和参考资料,供进一步学习

Java 8的新增功能:Lambdas

如何使用Lambda按键和值对HashMay进行排序?

如何在Java 8中使用map和flatMap?

如何在Java 8中进行Map Reduce?

如何在Java 8中将lambda表达式转换为方法引用?

Java SE 8新功能–完整指南

感谢您到目前为止阅读本文。 如果您喜欢我对Functional接口和@Functional注释的解释,请与您的朋友和同事分享。 如果您有任何疑问或反馈,请发表评论。

翻译自: https://www.javacodegeeks.com/2018/01/functional-interface-java-8-functional-annotation-examples.html

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

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

相关文章

win10存储池_3个光威480G SSD组WIN10存储池,深度测试到底值不值得搞

上次由于我SSD不够,所以我用虚拟硬盘的方式,虚拟了3个VHDX硬盘,组了个奇偶校验的存储池,并且简单的做了测试。测试结果是,组存储池确实提高了我们的数据安全性。WIN10存储池,可以让我们玩家省去组RAID&…

截止角频率和截止频率的关系_开关电源的控制环截止频率和开关频率有什么关系?...

【新朋友】点击上方蓝字“电源之家”关注【老朋友】点击右上角按钮,分享到朋友圈电源之家官方技术③群:522815202(3000人群)(电源行业第一大技术交流QQ群)这个问题很专业,因此答案注定也专业而非科普,非电力电子专业小伙伴看不懂很…

restlet_Restlet框架– Hello World示例

restletRestlet是用于Java平台的轻量级,全面的开源REST框架。 Restlet适用于服务器和客户端Web应用程序。 它支持主要的Internet传输,数据格式和服务描述标准,例如HTTP和HTTPS,SMTP,XML,JSON,At…

在运行时在Spring Cloud Config中刷新属性配置

在本系列Spring Cloud Config的教程系列中,我们将讨论在运行时刷新属性配置的过程,我们将使用Spring Boot致动器/refresh端点进行/refresh 。 此外,我们还将研究使用RefreshScope注释刷新Value属性。 在我的Spring Cloud Config的上一教程中…

pythonnumpy教程_Python学习教程:通俗易懂的Numpy入门教程

Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pandas也是基于numpy构建的,机器学习包scikit-learn也大量使用了numpy方法。本文介绍了Numpy的n维数组在数据处理和分析的所有核心应用。目录如何构建numpy数组如何观察数…

css hack技巧_5种减少Hack的编码技巧

css hack技巧在本文中,我们将探讨五种方法,这些方法可以使用有效的编码来帮助垃圾回收器花费更少的CPU时间分配和释放内存,并减少GC开销。 较长的GC通常会导致我们的代码在回收内存时停止(也称为“停止世界”)。 一些…

mysql数据库全备_MySQL innobackupex全备是指什么

MySQL innobackupex全备是指什么发布时间:2020-06-03 10:10:31来源:51CTO阅读:133作者:三月下文主要给大家带来MySQL innobackupex全备是指什么,希望这些内容能够带给大家实际用处,这也是我编辑MySQL innob…

数组初始化使用(写)new与不使用(不写)new

首先,数组初始化时,写不写new没有区别的。int arr[] new int[]{ 3, 9, 8};或者int[] arr {3,9,8};编译器遇到 int a[] {3, 8, 9}; 会编译成和 int a[] new int[] {3, 8, 9}; 完全一样的中间代码。 ①不同于String类。String由于实现了常量池&#xf…

Java数组(2)--一维数组

一、一维数组的(声明赋值)初始化 声明:type var[]; 或 type[] var;(示例:int[] age;) 初始化: ①动态初始化:声明且为数组元素分配空间,与赋值的操作分开进行 int[] ar…

Java数组(3)--二维(多维)数组

二维数组相当于一维数组的元素是一维数组 一、二维数组声明赋值初始化 动态初始化① int[][] arr new int[3][2];定义了名称为arr的二维数组 二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为…

workflow java_workflow java实现的activity工作流实例 Develop 238万源代码下载- www.pudn.com...

文件名称: workflow下载收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 134 KB上传时间: 2014-09-18下载次数: 3提 供 者: 张华详细说明:java实现的activity工作流实例 -java activity文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉)…

使用OAuth 2 / OpenID Connect的SSO的Spring Boot 2本机方法

这篇文章是3篇系列文章的最后一部分,该系列文章探讨了如何为基于Spring Boot 2的应用程序启用OAuth2提供程序SSO。 3个帖子是: 引导兼容OpenID Connect的OAuth2授权服务器/ OpenID提供程序的方法 与OAuth2授权服务器/ OpenID提供程序集成的旧版Spring …

实现任意行数的杨辉三角

public class JavaTest {public static void main(String[] args) {//放置杨辉三角的数组&#xff0c;可通过更改new int[n][]中n的值以获取不同行数的杨辉三角int[][] yangItem new int[10][];//获取杨辉三角数组中每个元素的值for (int i 0;i < yangItem.length;i){//当…

java excel sheet页_Java导出Excel Sheet页

1、问题背景导出Excel表格时&#xff0c;首先要生成Sheet页&#xff0c;下面将介绍如何生成Sheet页2、实现源码/**** Project:* Title:ExcelExport.java* Package:report.utils* Description:* Author:YouHaiDong* Date:2015年11月2日 下午6:29:22* Version:*/package report.u…

鸿蒙与安卓系统简单对比,绝非追求三分天下。

鸿蒙是面向5G物联网、面向全场景的分布式操作系统&#xff0c;其不是安卓系统的分支或修改而来的&#xff0c;与安卓、iOS是不一样的操作系统。鸿蒙将打通手机、电脑、平板、电视、电器设备、工业自动化控制、无人驾驶、车机设备 、智能穿戴统一成一个操作系统&#xff0c;并且…

(0.1)鸿蒙HarmonyOS开发工具DevEco Studio设置

1、打开设置操作框 2.1主题设置&#xff08;可以工具自己的喜好设置主题&#xff09; 2.2设置字体 2.3设置注释 2.4设置提示语句忽略大小写&#xff08;输入小写时&#xff0c;提示语句也会出现大写的关键字等&#xff09; 2.5设置自动导包&#xff08;不用导包&#xff0c;工具…

向Java最佳专家的全球专家学习Java

Java with the Best Virtual Conference是您学习微服务&#xff0c;Java 9&#xff0c;Kubernetes以及其他Java的指南&#xff01; 将于4月17日至18日收听&#xff0c;收听来自Pivotal&#xff0c;RedHat&#xff0c;Microsoft&#xff0c;Oracle和Netflix等公司的行业领导者进…

(0.2)HarmonyOS鸿蒙开发工具DevEco Studio工程文件目录结构

1、基本不会去动添加修改的一些文件夹 2、主要直接使用操作的文件夹entry 3、开发操作main文件夹 也就是说&#xff0c;我们其实主要就只要用到java&#xff0c;resources两个文件夹和config.json一个文件。把代码放java文件夹里面&#xff0c;把开发用到的图片视频等资源放res…

(0.3)HarmonyOS鸿蒙开发工具DevEco Studio 模拟器使用

1、登录华为账号 2、打开模拟器 3、选择模拟器 4、将程序运行在模拟器 5、当下面的building进度条完成后

(1.1)HarmonyOS鸿蒙中Ability概念及意义

1、简单理解&#xff1a;在鸿蒙中&#xff0c;可以简单理解为&#xff0c;打开APP后一个页面为一个Ability&#xff0c;而一个页面里面又有很多子页面&#xff08;切片、片段&#xff09;为AbilitySlice。 2、意义 一个Ability对应一个Hap包&#xff0c;一个APP则是由多个Hap包…