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中的功能接口是什么
好吧,一个功能接口不过是带有一个抽象方法的接口,例如Comparable
, Runnable
, EventListener
, Comparator
等。您可以看到这些接口甚至在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传递给所有接受方法的现有方法
Comparator
, Runnable
或任何只有一个抽象方法的任何其他接口。
这就是Java中的lambda表达式也被称为SAM类型的原因,其中SAM表示单一抽象方法。
@Functional注释有什么作用?
现在,让我们看看@Functional
注释是做什么的? 如果仅在其上方添加@Functional
注释,它将使接口起作用吗? 好吧,不,它不会那样做。 实际上,
可选的 。
这意味着您可以在不使用@Functioanl
批注的情况下创建功能接口,就像可以在不将@Override
批注放在方法顶部的情况下@Override
方法一样。 那么, @Functional
批注的真正目的是什么?
好吧,它可以确保该接口实际上只有一种抽象方法,并且还向诸如Javadoc之类的工具提供了此接口是功能性接口的提示。 它与@Override
批注非常相似,它通过验证您实际上是重写方法来帮助防止人为错误。
与@Override
相似,它的最佳做法是使用单个抽象方法将@Functional
批注放在方法顶部,以向Javadoc等工具指示它们是功能接口。
用@Functional
注释对java.util.function包中添加的所有新功能接口进行注释。
顺便说一句,是的,我们在JDK 8中提供了更多的功能接口,特别是通用功能接口,例如Predicate
, Supplier
, Consumer
, Function
, BiFunction
, UnaryOperator
等。请参见
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方法示例注释 @
java方法示例注释 @_Java 8中的功能接口是什么? @功能注释和示例相关推荐
- java word替换图片_Java Word中的文本、图片替换功能
Word中的替换功能以查找指定文本然后替换为新的文本,可单个替换或全部替换.以下将要介绍的内容,除常见的以文本替换文本外,还将介绍使用不同对象进行替换的方法,具体可包括: 1. 指定字符串内容替换文本 ...
- java方法命名规则_java中方法的命名规范
java中方法的命名规范 发布时间:2020-06-25 19:52:51 来源:亿速云 阅读:167 作者:Leah 这期内容当中小编将会给大家带来有关java中方法的命名规范,文章内容丰富且以专业 ...
- java 方法重载调用_Java方法的定义以及调用、方法重载、可变参数以及递归
何谓方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 System.out.println();/ ...
- java 方法 函数 区别_Java中的构造函数和方法之间的区别
Java方法一种方法用于探索对象的行为. 我们可以在方法的前面加上访问修饰符. 方法必须具有返回类型,例如void,任何原始类型(int,char,float等),任何Object类型(Integer ...
- xsl调用java方法传参_Java中的XSL转换:一种简单的方法
xsl调用java方法传参 XSL转换 (XSLT)是将一个XML文档转换为另一个XML文档的强大机制. 但是,在Java中,XML操作相当冗长和复杂. 即使是简单的XSL转换,也必须编写几十行代码- ...
- java 方法调用表达式_java lambda怎么表达式判断被调用接口名称和接口中方法
1.首先能够用于lambda表达式的只能是interface,并且interface 中只有一个方法. 这就说明,只要找到接口类型就能确定用的是哪个方法.(如下:intTypeInterface.St ...
- java方法可选参数_Java可选参数
java方法可选参数 在Java类中设计方法时,某些参数对于其执行而言可能是可选的. 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的. 从本文中, 您将学习如何在Java ...
- java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...
- 使java方法全部折叠_Intellij IDEA中一次性折叠所有Java代码的快捷键设置
Intellij IDEA中一次性折叠所有Java代码的快捷键设置 问题:在Java文件中,想把所有的Java方法代码都一次性给折叠起来,用哪个点开哪个. 问题来源:在新建model bean的时候, ...
最新文章
- Beaker:一个基于Electron的点对点Web浏览器
- loadrunner—参数化
- android6.0源码分析之Camera API2.0下的Capture流程分析
- 收藏 |彻底搞懂感受野的含义与计算
- exchange EWS 开发随笔二
- 计算机组成原理试题解析pdf,计算机组成原理试题集.pdf
- 查找与清除线程插入式木马
- 动力电池集成关键技术及电池测试与验证
- maven No plugin found for prefix ‘G‘ in the current project and in the plugin groups
- AlgLib 使用----稀里糊涂
- nmn是真的还是假的,如何鉴别高质量的nmn,方法一览
- 图片无缝隙衔接html,ps拼接图片无缝隙过渡拼接边缘处理消除拼接痕迹
- ADMIN云计算系统管理
- VUE+VSCODE(新建一个项目)
- pythoncad官网_Pycad: Python Extension for AutoCad
- 谈谈snprintf
- CUDA快速傅里叶变换 cuFFT
- vs2015 - vs2010
- 双CPU与单CPU有什么区别,有什么优势?
- html定义var,html的var标签是什么?关于var标签的定义和用法详解
热门文章
- AT4120-[ARC096D]Sweet Alchemy【贪心,背包】
- P2178-[NOI2015]品酒大会【SA,并查集】
- Codeforces Round #666 (Div. 2)
- P2604 ZJOI2010 网络扩容,费用流裸题
- Spring Boot之程序性能监控
- SpringBoot2.1.9 多数据源Mybatis—JDBC配置
- 企业级负载均衡如何实现
- [初级]Java中的switch对整型、字符型、字符串的具体实现细节
- jdk的安装与环境变量的配置
- Linux中打包和解压到的方法