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文件中声…

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

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

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

本站已不再更新,最新资源请前往zcjun.com获取!css:.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…

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

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

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

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

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

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

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

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

datastore_使用Spring Session和JDBC DataStore进行会话管理

datastore在Web应用程序中,用户会话管理对于管理用户状态至关重要。 在本文中,我们将学习在集群环境中管理用户会话所采用的方法,以及如何使用Spring Session以更简单和可扩展的方式实现该方法。 通常在生产环境中,我们将有多个服…

做一个公众号大概要多少钱_公众号流量主一个月可以赚多少钱?

我是小郁儿,点击上方“关注”,每天为你分享自媒体运营与个人精进干货。细心的读者会发现,阅读我文章的时候,最下面不再出现广告卡片了,因为我前几天已经把流量主功能关掉。起初是因为我在看自己发的视频时,…

从Speedment 3.0.17或更高版本的事务轻松返回值

交易次数 在我以前的文章中,我写了关于如何使用Speedment轻松使用事务的方法,其中我们原子地更新了两个银行帐户。 众所周知,事务是一种将多个数据库操作组合到一个原子执行的单个操作中的方法。 但是事务不仅与更新数据库有关,而…

分布式锁的三种实现方式_分布式锁的多种实现方式

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区…

apache ignite_使用Apache Ignite优化Spark作业性能(第1部分)

apache ignite来看看他们是如何工作的! 本文的某些部分摘自我的书《 Apache Ignite的高性能内存计算》 。 如果您对这篇文章感兴趣,请查看本书的其余部分,以获取更多有用的信息。 Apache Ignite提供了多种方法来提高Spark作业的性能&#xf…

微软家庭服务器,微软公布Windows Server 2012版本方案,不再提供家庭服务器版

微软官方网站今日公布Windows Server 2012将有四个版本,分别为Foundation、Essentials、Standard以及Datacenter。其中Foundation只供给原始设备制造商(OEM);Essentials适合中小企业使用,最大用户数为25个;Standard与Datacenter版…

eclipse创建神经网络_使用Eclipse Deeplearning4j构建简单的神经网络

eclipse创建神经网络神经网络导论 深度学习包含深度神经网络和深度强化学习,它们是机器学习的子集,而机器学习本身就是人工智能的子集。 广义地说,深度神经网络执行机器感知,该机器感知从原始数据中提取重要特征,并对每…

angluar cdk_零分钟即可在容器开发套件(CDK)上实现云运营

angluar cdk尽管这很有趣,但是它实际上并不可行,并且很快就遇到了使用限制。前一段时间, 我逐步完成了在容器中安装称为CloudForms的云管理解决方案。 真正的解决方案是将这个示例放入Red Hat Demo Central集合中,并将其放在基于…

网络研讨室_免费网络研讨会:Java应用程序中的吞咽异常

网络研讨室1月30日参加我们的网络研讨会,以发现Java应用程序中的“隐藏”异常。 如果一棵树落在森林中,但是没有写到原木上,它会发出声音吗? 答案是肯定的。 这些类型的错误可能会对用户体验造成严重影响,而没有根本原…

java8默认内存收集器_使用正确的垃圾收集器将Java内存使用量降至最低

java8默认内存收集器大小对于软件至关重要。 很明显,与大的整体方法相比,在微服务体系结构中使用小片段具有更多优势。 最新的Java版本的Jigsaw有助于分解旧应用程序或从头开始构建新的云原生应用程序。 这种方法减少了磁盘空间,构建时间和启…

oc 协议 回调 静态成员_每日一问:c++类的成员函数,能作为线程的参数吗?

问:类的成员函数可以传入线程参数吗?回答:如果c语言的全局函数,可以。如果是类的静态成员函数,可以如果是类的普通成员函数,不可以为什么?《深入探索C对象模型》中提到成员函数时,当…

flink读取不到文件_日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践...

简介: 友信金服公司推行全域的数据体系战略,通过打通和整合集团各个业务线数据,利用大数据、人工智能等技术构建统一的数据资产,如 ID-Mapping、用户标签等。友信金服用户画像项目正是以此为背景成立,旨在实现“数据驱…