通过JDK8源码javadoc,可以知道@FunctionalInterface有以下特点:

该注解只能标记在"有且仅有一个抽象方法"的接口上,表示函数式接口。
JDK8接口中的静态方法和默认方法,都不算是抽象方法。
接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中的方法,那么也不算抽象方法。
该注解不是必须的,如果一个接口符合"函数式编程"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查,如果编写的不是函数式接口,但是加上了@FunctionalInterface 那么编译器会报错。
代码说明:使用Lambda表达式。一般的格式是 ()->{} ,如果{}里面只有一行代码,则{}可以省略。 (->左边的()表示方法体,如果有形参,则在()中添加形参,->右边{}表示具体逻辑。如果方法体返回值是void,则甚至可以在{}中不写任何逻辑(当然也要结合场景)。返回值如果有值,则需要写具体的逻辑,return处理后的值。)理解这里非常重要!!!!

演示一、请求参数、返回参数均有值的接口

package com.calvin.currency.function;

/**
 * @Title CustomFuctionInterface
 * @Description 自定义函数式接口之演示一、请求参数、返回参数均有值的接口
 * @author calvin
 * @date: 2020/3/3 1:02 AM 
 */
@FunctionalInterface
public interface CustomFuctionInterface {

String printStr(String str1, String str2);

}

代码测试

@Test
public void test1() {
    CustomFuctionInterface customFuctionInterface = (str1, str2) -> "hello " + str1 + str2;
    String printStr = customFuctionInterface.printStr("A&", "B");
    System.out.println("printStr = " + printStr);
}

控制台输出结果:

演示二、请求参数没有值、返回参数有值的接口

package com.calvin.currency.function;

/**
 * @Title CustomFuctionInterface
 * @Description 自定义函数式接口之演示二、请求参数没有值、返回参数有值的接口
 * @author calvin
 * @date: 2020/3/3 1:06 AM
 */
@FunctionalInterface
public interface CustomFuctionInterface2 {

String printStr();

}

代码测试

@Test
public void test2() {
    CustomFuctionInterface2 customFuctionInterface2 = () -> "hello world";
    String printStr = customFuctionInterface2.printStr();
    System.out.println("printStr = " + printStr);
}

控制台输出结果:

演示三、实际项目中可借鉴使用(落地)

/**
 * @Title CustomFuctionInterface
 * @Description 自定义函数式接口之演示三、实际项目中可借鉴使用(落地)
 * @author calvin
 * @date: 2020/3/3 1:25 AM
 */
@FunctionalInterface
public interface CustomFuctionInterface3 {

void doSomething();

}

假设现在某个类的某个方法形参为CustomFuctionInterface3,如代码所示:

public static void execute(CustomFuctionInterface3 interface3) {
    interface3.doSomething();
}

传统的调用方法 :

@Test
public void test3() {
    execute(new CustomFuctionInterface3() {
        @Override
        public void doSomething() {
            System.out.println("doSomething...");
        }
    });
}

控制台输出结果:

通过Lambda表达式改进以上测试代码:

@Test
public void test3() {
    execute(() -> System.out.println("doSomething..."));
}

再次查看控制台输出结果:

可以发现结果是一致的,代码看起来更加简洁美观。

总结: 以上几个小案例,通过使用函数式接口@FunctionalInterface+Lambda表达式进行了代码演示,对于我们理解函数式编程的思想以及并发工具包JUC下的函数型、断定型、消费者、供给型等接口的源码阅读都有一定的帮助。
————————————————
版权声明:本文为CSDN博主「电商技术进阶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/haogexiang9700/article/details/104623782

函数式接口@FunctionalInterface使用示例相关推荐

  1. JDK8新特性:函数式接口@FunctionalInterface的使用说明

    我们常用的一些接口Callable.Runnable.Comparator等在JDK8中都添加了@FunctionalInterface注解. 通过JDK8源码javadoc,可以知道这个注解有以下特 ...

  2. Java之函数式接口(FunctionalInterface)

    Java之函数式接口(FunctionalInterface) 1. FunctionalInterface是什么? FunctionalInterface 中文称之为 函数式接口.是Java新特性之 ...

  3. Java:Java 8 函数式接口FunctionalInterface

    文档 https://www.runoob.com/java/java8-functional-interfaces.html 定义函数式接口 package com.github.mouday.de ...

  4. Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface

    Jdk1.8新增lambda表达式是为了简化代码,主要用于简化匿名实现类,为其提供一种更加简洁的写法.Lambda表达式在swift语言中被称为代码块,lambda表达式可以认为是一种特殊的接口,是匿 ...

  5. java函数式 new_java8简单入门--函数式接口 @FunctionalInterface

    1.介绍 看了几篇关于 java8 入门的例子,其中引入了许多令人期待已久的特性(虽然我没有过这样的体会),但不管你的代码是普通青年款还是文艺青年款,你都可以从被 java8 的重新组织的代码看到她的 ...

  6. java8 interface_Java8新特性:函数式接口@FunctionalInterface使用说明

    我们常用的一些接口Callable,Runnable,Comparator等在JDK8中都添加了@FunctionalInterface 注解: 通过JDK8 源码javadoc,可以知道@Funct ...

  7. JAVA8特性之函数式接口-@FunctionalInterface注解

    函数式接口: 定义: 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,总体有点像匿名类 @FunctionalInterface: 该注解可加可不加,它是函数式接口语法检查注解的,当然最 ...

  8. java函数式接口@FunctionalInterface的详细解析

    目录 前言 1. 函数式接口 2. @FunctionalInterface定义 3. 使用方法 前言 关于函数式接口都可以使用lambda表达式实现 具体涉及到lambda表达式可以看我之前的文章进 ...

  9. @FunctionalInterface函数式接口注解

    @FunctionalInterface注解 作用于接口上.表明这个接口是一个特殊的接口即 :函数式接口 一般的接口可以有任意的抽象方法.但是函数式接口却规定了该接口只能有一个抽象的方法.正是由于这点 ...

最新文章

  1. C/C++使用keybd_event模拟键盘按键
  2. 学习Docker容器网络模型 - 搭建分布式Zookeeper集群
  3. 原生js实现preAll和nextAll方法
  4. C语言中的extern关键字用法
  5. ProfessionalDotNetNuke 第一章(摘录)
  6. ES5-11原型与原型链深入、对象继承
  7. 股票涨停之后该不该卖?
  8. python语言的变量特点随时_【Python】Python语言特点
  9. 0基础学java可行吗_上海0基础学JAVA可行吗?
  10. harmonyos鸿蒙,HarmonyOS鸿蒙入门篇
  11. oracle 无效的窗口句柄 print spooler服务已开,大师为你解决win10系统无法运行print spooler服务的恢复技巧...
  12. 人生性格分析02-60干支日
  13. 南京大学计算机 国家重点实验室,南京大学
  14. DJI Onboard-SDK-ROS-4.0.1 在妙算2-G上编译运行
  15. WPS批量根据标题设置目录编号问题与目录级别快速调整
  16. 邮箱传大文件怎样快_5款好用的企业邮箱推荐
  17. 读LockSupport源码
  18. 优矿-获取商品期权数据
  19. Linux中man手册的安装以及使用详解
  20. rpm包与deb包的制作过程

热门文章

  1. 【Boost】boost库asio详解9——UDP的简单例子1
  2. dy之xgorgon0404参数
  3. docker学习笔记(三)docker中的网络
  4. 经典|Linux:为什么性能工具需要 BPF 技术(送多本)
  5. 防止NullPointerException,是程序员的基本修养
  6. 二叉树和栈的基本操作
  7. 边缘计算不“边缘”——助攻视频行业这几年
  8. Spark之Spark角色介绍及运行模式
  9. 「递归」第7集 | 腾讯开源联盟出征!
  10. 史上最复杂业务场景,逼出阿里高可用三大法宝