java方法示例注释 @_Java 8中的功能接口是什么? @功能注释和示例

java方法示例注释 @

函数接口是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是一个lambda表达式,可以将其转换为BiFunction功能接口的实例。

一个更简单的示例是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

java方法示例注释 @

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

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

相关文章

sql 除法_七天学会SQL-04SQL复杂查询

一、视图(以下SQL操作都在Navicat客户端下操作)1、什么是视图?1.是什么? 视图存放sql查询语句,使用视图时,会运行视图里的sql查询语句创造出一张临时表;如需频繁使用一段sql查询语句时可将该查询…

r中rep_Spring中@ Component,@ Service,@ Controller和@Repository之间的区别

r中rep在了解Spring框架中Repository Component , Service Controller , Repository Controller和Repository批注之间的区别之前,了解Component批注在Spring中的作用很重要。 在Spring的初始发行期间,所有bean都用于在XML文件中声…

dedian系统云服务器,云服务器选择Ubuntu还是Debian镜像系统?根据熟悉度选择

我们在选择云服务器的时候是不是对于镜像系统选择也有一些纠结,当然对于老用户而言绝对是没有这些问题的。一来我们可以根据自己的熟悉度选择,你平时用什么就选择什么,以及我们可以根据实际的需要有些朋友还会自定义安装自己的镜像系统。当然…

关于压缩工具 7z(7-zip) 如何创建自释放档案(选项 -sfx 的解读)

文章目录一、选项 -sfx 介绍二、自释放安装模块三、创建自释放档案(创建安装程序)(一)安装程序配置文件格式(二)配置文件示例四、创建自释放档案示例(一)添加 *.txt 文件到自释放档案…

python 正整数 连续多个数之和_vijos - P1302连续自然数和 (公式推导 + python)

18 142297 328388 4121998 2002这道题目假设用C能够直接枚举,非常快就能够过,并且时间,可是这样对我们学习数论知识没有一点帮助。由于数论不仅仅是简单的枚举很多其它的是公式的推导,所以我对于数论题目尽可能的使用耗时长一点的…

远程服务器如何创建分支,git如何远程创建分支

git如何远程创建分支我不知道有什么办法可以直接在远程创建分支而不需要clone到本地。背景需求我的需求是直接在远程服务器上创建一个分支直接在远程服务器上删除一个分支这期间都不需要clone到本地来。原因是当项目有多个repository的时候其中的部分创建了一个分支&#xff0c…

关于压缩工具 7z(7-zip) 的选项 -si(从标准输入流读取数据)的解读

文章目录一、选项 -si 介绍二、示例(一)使用 Doc2.txt 文件名压缩输入流从文件 Doc.txt 到压缩档案 archive.gz一、选项 -si 介绍 选项 -si 使 7-Zip 从 stdin(标准输入了) 中使用(读取)数据。可以和此选项…

adf4351使用_使用ADF绑定创建视图对象行CreateInsert操作

adf4351使用在这篇简短的文章中,我将重点介绍与在任务流中创建新记录的一种非常常见的方法有关的一个小陷阱。 让我们考虑一个简单的任务流程示例,该任务流程创建一个新的VO行,如果用户单击“确定”按钮,则在页面片段上显示该行并…

python实现var模型_copula函数及其Var计算的Python实现

Copula函数思想Copula函数能够把随机变量之间的相关关系与变量的边际分布分开进行研究&#xff0c;这种思想方法在多元统计分析中非常重要。直观来看&#xff0c;可以将任意维的联合分布H(x1,...,xn)P(X1<x1,...,Xn<xn)分成两步来处理。第一步是&#xff0c;对所有的单随…

css鼠标移入线条延中心伸长,css动画效果:鼠标移上去底部线条从中间往两边延伸 - 子成君-分享出去,快乐加倍!-旧版已停更...

本站已不再更新,最新资源请前往zcjun.com获取!css&#xff1a;.top-nav a:after {content: ;position: absolute;z-index: 2;bottom: 0;left: 50%;display: block;width: 165px;height: 1px;transform: translate(-50%);}.top-nav a:hover:after {height: 2px;animation: ad_w…

Spring,Reactor和ElasticSearch:从回调到React流

Spring 5&#xff08;以及Boot 2&#xff0c;将在数周内到货&#xff09;是一次革命。 不是“ XML上的注释 ”或“ Java上的注释类 ”的革命。 这是一个真正的革命性框架&#xff0c;可以编写全新的应用程序类别。 近年来&#xff0c;我对此框架感到有些恐惧。 “ Spring Cloud…

关于压缩工具 7z(7-zip) 的选项 -so(从标准输出流写入数据)的解读

文章目录一、选项介绍二、选项示例&#xff08;一&#xff09;解压缩 archive.gz 输出流并将该输出流写入到 Doc.txt 文件&#xff08;二&#xff09;压缩 Doc.txt 输出流并将该输出流写入到 archive.gz 压缩档案一、选项介绍 选项 -so 使 7-Zip 从 stdout&#xff08;标准输出…

python删除重复文字_python如何删除文件中重复的字段

本文实例为大家分享了python如何删除文件中重复字段的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下原文件内容放在list中&#xff0c;新文件内容按行查找&#xff0c;如果没有出现在list中则写入第三个文件中。import csvfiletxt1 E:/gg/log/log1.txtfilecsv1 E:…

css 深度选择器 ,CSS的coped私有作用域和深度选择器

大家都知道当 编译前&#xff1a;.example {color: red;}编译后&#xff1a;.example[data-v-f3f3eg9] {color: red;}看完你肯定就会明白了&#xff0c;其实是在你写的组件的样式&#xff0c;添加了一个属性而已&#xff0c;这样就实现了所谓的私有作用域。但是也会有弊端&…

关于压缩工具 7z(7-zip) 的选项 -u(更新压缩档案中的文件)的解读

文章目录一、选项介绍&#xff08;一&#xff09;参量说明二、示例一、选项介绍 更新选项 -u 指定压缩档案中文件的更新及创建的方式。可以和此选项结合使用的命令&#xff1a;a (添加)&#xff0c; d (删除)&#xff0c; u (更新) 。 语法格式&#xff1a;-u[-][action_set]…

营销自动化权威指南_免费电子书:自动化根本原因分析的完整指南

营销自动化权威指南自动化根本原因分析入门指南。 我们在OverOps过夜&#xff0c;梦想着拥有一个自动化的世界。 看起来似乎有些怪异&#xff0c;但是您能想象您和您的团队会比那些不眠之夜和无休止的日子在日志文件中筛选以找出问题出在哪里的快乐多了吗&#xff1f; 这些乏…

光立方原理讲解_90%人不理解什么是防眩光射灯 防昡晕 防炫光,。怎么选项led防眩灯...

关于LED射灯“防眩光(防炫光)”实在想和各位朋友讲解一下防眩光原理 &#xff0c;因为我们碰到90%以上装修朋友&#xff0c;总是把眩光理解为简单的不刺眼的光。我可以负责的告诉大家 &#xff0c;市面上没有不刺眼的射灯&#xff0c;不管是LED芯片直接射出来的光&#xff0c;还…

打印机设置虚拟服务器,虚拟机打印机服务器设置

虚拟机打印机服务器设置 内容精选换一换迁移前&#xff0c;您需要设置目的端服务器。该目的端用来接收源端的数据&#xff0c;同时您也可以使用该目的端进行迁移测试和启动目的端。只有“迁移阶段”为“已就绪”时才可设置目的端。或单击“操作”列的“更多 > 设置目的端”&…

关于压缩工具 7z(7-zip) 的选项 -w(设置工作目录)的解读

文章目录一、选项介绍二、语法格式三、选项示例一、选项介绍 选项 -w 为文件压缩设置临时的工作目录。可以和此选项结合使用的命令&#xff1a;a (添加)&#xff0c; d (删除)&#xff0c; u (更新) 。 默认情况下&#xff0c;7-Zip 新建一个压缩档案时&#xff0c;会临时在当…

nginx fastcgi python_Nginx + webpy 和FastCGI搭建webpy环境

web.py 是一个轻量级Python web框架&#xff0c;它简单而且功能大。web.py是一个开源项目。1、所需要的软件&#xff1a;Nginx nginx-1.4.7.tar.gz (需要包含fastcgi和rewrite模块)。Webpy 0.32Spawn-fcgi 1.6.2Flup注意&#xff1a;Flup是最常见的忘记装的软件&#xff0c;需要…