什么是函数式接口(Functional Interface)

所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。
补充下:方法也可以有具体默认实现逻辑,需要用default修饰

这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。

函数式接口用途
它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

我会通过个例子介绍具体使用,也是我项目中使用比较常见的用法

先定义一个函数接口


/*** @author zhaoyy* @version 1.0* @description 定义函数接口* @date 2022/4/28**/
@FunctionalInterface
public interface CustomizeFunction<T, R> {/*** Applies this function to the given argument.*/R apply(T t) throws Exception;}

具体实现函数接口CustomizeFunctionImpl,CustomizeFunctionImpl2

/*** @author zhaoyy* @version 1.0* @description 函数接口实习 1* @date 2022/4/29**/
public class CustomizeFunctionImpl implements CustomizeFunction {@Overridepublic Object apply(Object o) throws Exception {return Integer.valueOf(o.toString()) + 1;}
}
/*** @author zhaoyy* @version 1.0* @description 函数接口实现2* @date 2022/4/29**/
public class CustomizeFunctionImpl2 implements CustomizeFunction {@Overridepublic Object apply(Object o) throws Exception {return Integer.valueOf(o.toString()) + 2;}
}

测试函数main方法


import java.util.ArrayList;
import java.util.List;/*** @author zhaoyy* @version 1.0* @description 测试自定义函数main* @date 2022/4/28**/
public class CustomizeFunctionTest {public static void main(String[] args) throws Exception {CustomizeFunction<Integer, Integer> function = (x) -> 1 + x;Integer result = function.apply(3);System.out.println("==========自定义函数============");System.out.println(result);CustomizeFunction<Integer, Integer> function2 =CustomizeFunctionTest::add;Integer rep = function2.apply(3);System.out.println("==========自定义函数调用方法============");System.out.println(rep);System.out.println("======自定义函数方法继承方法重写================");List<CustomizeFunction<Integer, Integer>> list = new ArrayList<>();list.add(new CustomizeFunctionImpl());list.add(new CustomizeFunctionImpl2());int index = 5;for (CustomizeFunction<Integer, Integer> extractorFunction : list) {Integer res = extractorFunction.apply(index);System.out.println(res);}}public static Integer add(Integer x){return 1 + x;}
}

结果输出:

==========自定义函数============
4
==========自定义函数调用方法============
4
======自定义函数方法继承方法重写================
6
7Process finished with exit code 0

测试案例说明:
1.首先我们创建了一个接口CustomizeFunction 使用函数注解:@FunctionalInterface 。参数说明:R返回对象,T入参对象,只有一个方法apply().

2.实现类CustomizeFunctionImpl,CustomizeFunctionImpl2分别对函数CustomizeFunction 中的apply()方法重写,具体按详细类方法,一个是对入参加1,一个是对入参加2并返回计算完结果

3.CustomizeFunctionTest输出第一值:4,通过Lambda 表达式计算并返回数据(x) -> 1 + x 对入参加1,第二个输出,调用的是类方法通过lambda 表达式,与第一个输出同等只是做了方法抽离。第三个输出,分别调用具体实现方法逻辑计算返回数据。

java 8之函数编程自定义函数接口@FunctionalInterface相关推荐

  1. java juel表达式_activiti 自定义函数解析juel表达式

    activiti是支持juel表达式的,这个也很好用,但实际过程中需要支持类方法及变量. 原来项目中解析juel,这边有自定义一个方法的 代码如下: public String getStringBy ...

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

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

  3. java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 看 ...

  4. 还看不懂同事的代码?Lambda 表达式、函数接口了解一下

    本文经授权转载自微信公众号:未读代码 Java 8 早已经在2014 年 3月 18日发布,毫无疑问 Java 8 对 Java 来说绝对算得上是一次重大版本更新,它包含了十多项语言.库.工具.JVM ...

  5. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 ...

  6. windows下mysql 自定义函数 之http 实操

    有没有遇到这种场景呢,当使用mysql做复杂字符串处理的时候总感觉mysql内置的函数不够用呢.比如做字符串切割,解析xml等.而这个时候你恰恰对编写mysql函数或者存储过程缺乏一定的经验积累.而你 ...

  7. 皕杰报表自定义扩展~自定义函数

    皕杰报表工具中提供了170多个函数和操作符,基本能满足设计大部分报表的需求,遇到特殊情况,设计器里的函数不能满足需求时,就需要自定义一些函数来来满足你的需求. 1.皕杰报表自定义函数的类型: 自定义函 ...

  8. 【C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )

    文章目录 前言 一.业务子函数接口定义要点 二.完整代码示例 前言 字符串开发模型 : strstr-while/do-while 模型 : 在 字符串 中 查找 子串特征 ; 两头堵模型 : 两个指 ...

  9. spark自定义函数

    1.使用java,scala或者python等都可以编写自定义函数,编写完成后通过spark.udf函数注册即可使用 2.spark也支持hive自定义函数,使用类似create temporary ...

最新文章

  1. 计算两个日期之间的工作日
  2. 课后练习----实现窗口的切换
  3. spring 配置声明式事务 疯狂JAVA
  4. SAP成都研究院大卫哥:SAP C4C中国本地化之微信小程序集成
  5. ExtJs5.0在WebStorm上的使用之入门教程(一)编写第一个网页 HelloExt
  6. go语言 expected ; found a
  7. 点击编辑,进入编辑页面并把值渲染到页面上
  8. 图片自适应div比例缩放上下左右居中
  9. 热烈祝贺:关于OpenJDK8 LINUX版本输入法候选框不能跟随光标移动的BUG及解决办法,已上报Oracle
  10. c++ string split_闲话Python之砍瓜切菜split()
  11. 记录一次线上mysql事务隔离级别引发的思考
  12. 数据可视化BI平台--CBoard的使用
  13. 一拳超人手游显示服务器断开,一拳超人最强之男游戏无法登陆怎么办 解决方案一览...
  14. TM1620 LED 驱动控制 程序
  15. 真正的英雄(罗纳德·里根在“挑战者号”航天飞机失事后的演讲词)
  16. FPGA初学者__个人学习笔记(二)_ generate 用法
  17. Swagger导出pdf文档
  18. IOS11更新教程大分享(附带降级教程)
  19. 没想到国美竟然用oracle的团队来搭建电商平台
  20. 从事网络安全,可以考取什么证书?

热门文章

  1. oracle基础|oracle多表查询用法|什么是等值连接(inner join)|什么是不等值连接(between)|什么是左连接(left join)|什么是右连接(right join)
  2. 《不可思议的年代》读书笔记
  3. go get connectex: A connection attempt failed because the connected party did not properly respond
  4. 石油团队赛热身赛----问题 A: Magic Mirror,问题 I: Save the Room,问题 G: Give Candies
  5. 《高效能人士的7个习惯》-知彼解己
  6. 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展... 1
  7. no-cache,max-age=0,nostore区别及304原理
  8. 互联网及其应用——第一章 互联网概述
  9. 基于ngx-rtmp-module模块http-flv直播流的实现
  10. 3706 teradata 语句报错_TERADATA中函数的使用