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方法示例注释 @

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

  1. java word替换图片_Java Word中的文本、图片替换功能

    Word中的替换功能以查找指定文本然后替换为新的文本,可单个替换或全部替换.以下将要介绍的内容,除常见的以文本替换文本外,还将介绍使用不同对象进行替换的方法,具体可包括: 1. 指定字符串内容替换文本 ...

  2. java方法命名规则_java中方法的命名规范

    java中方法的命名规范 发布时间:2020-06-25 19:52:51 来源:亿速云 阅读:167 作者:Leah 这期内容当中小编将会给大家带来有关java中方法的命名规范,文章内容丰富且以专业 ...

  3. java 方法重载调用_Java方法的定义以及调用、方法重载、可变参数以及递归

    何谓方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 System.out.println();/ ...

  4. java 方法 函数 区别_Java中的构造函数和方法之间的区别

    Java方法一种方法用于探索对象的行为. 我们可以在方法的前面加上访问修饰符. 方法必须具有返回类型,例如void,任何原始类型(int,char,float等),任何Object类型(Integer ...

  5. xsl调用java方法传参_Java中的XSL转换:一种简单的方法

    xsl调用java方法传参 XSL转换 (XSLT)是将一个XML文档转换为另一个XML文档的强大机制. 但是,在Java中,XML操作相当冗长和复杂. 即使是简单的XSL转换,也必须编写几十行代码- ...

  6. java 方法调用表达式_java lambda怎么表达式判断被调用接口名称和接口中方法

    1.首先能够用于lambda表达式的只能是interface,并且interface 中只有一个方法. 这就说明,只要找到接口类型就能确定用的是哪个方法.(如下:intTypeInterface.St ...

  7. java方法可选参数_Java可选参数

    java方法可选参数 在Java类中设计方法时,某些参数对于其执行而言可能是可选的. 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的. 从本文中, 您将学习如何在Java ...

  8. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  9. 使java方法全部折叠_Intellij IDEA中一次性折叠所有Java代码的快捷键设置

    Intellij IDEA中一次性折叠所有Java代码的快捷键设置 问题:在Java文件中,想把所有的Java方法代码都一次性给折叠起来,用哪个点开哪个. 问题来源:在新建model bean的时候, ...

最新文章

  1. Beaker:一个基于Electron的点对点Web浏览器
  2. loadrunner—参数化
  3. android6.0源码分析之Camera API2.0下的Capture流程分析
  4. 收藏 |彻底搞懂感受野的含义与计算
  5. exchange EWS 开发随笔二
  6. 计算机组成原理试题解析pdf,计算机组成原理试题集.pdf
  7. 查找与清除线程插入式木马
  8. 动力电池集成关键技术及电池测试与验证
  9. maven No plugin found for prefix ‘G‘ in the current project and in the plugin groups
  10. AlgLib 使用----稀里糊涂
  11. nmn是真的还是假的,如何鉴别高质量的nmn,方法一览
  12. 图片无缝隙衔接html,ps拼接图片无缝隙过渡拼接边缘处理消除拼接痕迹
  13. ADMIN云计算系统管理
  14. VUE+VSCODE(新建一个项目)
  15. pythoncad官网_Pycad: Python Extension for AutoCad
  16. 谈谈snprintf
  17. CUDA快速傅里叶变换 cuFFT
  18. vs2015 - vs2010
  19. 双CPU与单CPU有什么区别,有什么优势?
  20. html定义var,html的var标签是什么?关于var标签的定义和用法详解

热门文章

  1. AT4120-[ARC096D]Sweet Alchemy【贪心,背包】
  2. P2178-[NOI2015]品酒大会【SA,并查集】
  3. Codeforces Round #666 (Div. 2)
  4. P2604 ZJOI2010 网络扩容,费用流裸题
  5. Spring Boot之程序性能监控
  6. SpringBoot2.1.9 多数据源Mybatis—JDBC配置
  7. 企业级负载均衡如何实现
  8. [初级]Java中的switch对整型、字符型、字符串的具体实现细节
  9. jdk的安装与环境变量的配置
  10. Linux中打包和解压到的方法