什么是函数编程接口?

约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equals),不算是函数式接口的方法。

被@FunctionalInterface注解该接口,没有该注解的接口满足约束也行。

在Java8中,满足下面任意一个条件的接口都是函数式接口:

被@FunctionalInterface注释的接口,满足函数式接口的约束。

没有被@FunctionalInterface注释的接口,但是满足函数式接口的约束。

@函数式的约束:

接口有且只能有个一个抽象方法,只有方法定义,没有方法体。

在接口中覆写Object类中的public方法,不算是函数式接口的方法。

在接口中的default方法,不算是函数式接口的方法。

在接口中的static方法,不算是函数式接口的方法。

自定义一个函数式编程接口

/*** 自定义一个函数式编程接口

* 函数式编程只有一个抽象方法,所以默认的是实现的是这个抽象方法

*@param

*@param*/@FunctionalInterfacepublic interface CalcFunctionInterface{/*** 计算t1和t2

*

*@paramt1

*@paramt2

*@return

*/R calc(T t1, T t2);

}

传入不同calc函数实现的对象,进行调用

相当于以前创建CalcFunctionInterface的匿名类,重写了calc方法(由于只有一个抽象方法,所以默认就是calc方法)

/*** 相当于一个类实现了CalcFunction接口中的唯一一个函数calc

* 然后在利用多态,调用calc函数,传入两个参数,进行计算*/@Testpublic voidadd(){

CalcFunctionInterface add = (t1, t2) -> t1+t2;

Integer calc= add.calc(2, 3);

System.out.println(calc);//5

}

传入一个匿名类对象,进行方法调用calc

@Testpublic voidmultiply(){//相当于通过匿名类的形式传入一个实现了CalcFunctionInterface接口的子类对象,重写了该接口的方法

Integer calc = FunctionalInterfacesTest.calc(2, 3, (t1, t2) -> t1 *t2);

System.out.println(calc);//6

}/*** 接受了一个对象,利用对象的calc方法计算*/

public static Integer calc(Integer i1, Integer i2, CalcFunctionInterfacecalc){returncalc.calc(i1,i2);

}

便捷的引用类的构造器及方法

一个Convert接口

@FunctionalInterfacepublic interface Convert{

T convert(F from);

}

lambda表达式的形式重写该函数式编程的唯一接口

@Testpublic voidtestLambda(){

Convert stringIntegerConvert = (from ->Integer.valueOf(from));

Integer convert= stringIntegerConvert.convert("123");

System.out.println(convert);//123

}

下面使用"::"运算符更精简

静态方法

@Testpublic voidtestStaticMethod(){

Convert stringInstantConvert =Instant::parse;

Instant convert= stringInstantConvert.convert("2019-04-25T16:09:03.852Z");

System.out.println(convert);//2019-04-25T16:09:03.852Z

}

实例方法

/*** 实例对象的方法*/@Testpublic voidtestObjectMethod(){

Something something= newSomething();

Convert startsWith =something::startsWith;

String convert= startsWith.convert("123");

System.out.println(convert);//1

}

classSomething {publicString startsWith(String s) {return String.valueOf(s.charAt(0));

}

}

对象的构造方法

/*** 调用对象的构造方法*/@Testpublic voidtestConstructor(){

PersonFactory personFactory = Person::new;

Person person= personFactory.create("Chris", "Paul");

System.out.println(person);//Person(firstName=Chris, lastName=Paul)

}

/*** Person 工厂*/@FunctionalInterfacepublic interface PersonFactory

{

P create(String firstName, String lastName);

}

@NoArgsConstructor

@AllArgsConstructor

@Getter

@Setter

@ToStringclassPerson {privateString firstName;privateString lastName;

}

Java8的内置函数式编程接口

java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法相关推荐

  1. predicate java 作用_Java函数式编程接口详解之Predicate

    一.初识 Predicate是Java提供的重要的函数编程接口之一,作用主要是用于逻辑判断. 首先看看源码: @FunctionalInterface public interface Predica ...

  2. 基于C++11模板元编程实现Scheme中的list及相关函数式编程接口

    前言 本文将介绍如何使用C++11模板元编程实现Scheme中的list及相关函数式编程接口,如list,cons,car,cdr,length,is_empty,reverse,append,map ...

  3. Java 8 Lambda表达式的函数式编程– Monads

    什么是monad ?: monad是一种设计模式概念,用于大多数功能编程语言(如Lisp)或现代世界的Clojure或Scala中. (实际上,我会从scala复制一些内容.)现在,为什么它在Java ...

  4. java函数式编程接口Function<T,R>实现数据转换

    java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据, 前者称为前置条件,后者称为后置条件. 1. apply方法应用 Funct ...

  5. java stream 取某个字段_java8的函数式编程和stream使用心得

    1:函数式编程 在很多其他的编程语言里面,都可以实现函数式的编程,也就是函数可以作为变量去灵活使用,但是java一直都不可以,之前很多都使用一些匿名内部类这种丑的亚批的代码.java8之后算是可以使用 ...

  6. 工具技巧和读文档 | 读函数式编程接口文档 | 匿名内部类 | lambda表达式 |IDEA

    Function接口,函数式接口 按入参返回值分类,大概分为4种类型,再加上多个入参就又多了Bi开头的两种. 有Ctrl+P的时候不懂参数列表该写啥,就先Ctrl+ALT看下入参类型的相关实现类! 一 ...

  7. java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生 ...

  8. java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket

    获取[下载地址] QQ: 313596790 官网 http://www.fhadmin.org/ A 代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [ ...

  9. java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis

    获取[下载地址]   QQ: 313596790 A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 ...

最新文章

  1. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想
  2. 喜马拉雅音频批量下载
  3. 寻找春天nbsp;九宫格日记-2011.09.20
  4. 唯一标识 微信小程序_微信小程序中用户唯一ID的获取
  5. PID调节参数的作用
  6. 从高考到程序员——我一直在寻找答案
  7. 如何修复iPhone、iPad 或 Mac 上的 AirDrop 连接问题?
  8. 免费PBootCMS采集支持聚合文章采集插件
  9. PHP 依赖注入 容器,PHP 依赖注入容器 Pimple 笔记
  10. NPDP知识推送-第一章新产品开发战略(2)
  11. 2023二建各科资料
  12. PHP 7.3 新特性介绍
  13. java当单据变化触发,UAP开发(NC63)遇到的错误记录
  14. 从技术实现角度看信贷ABS业务(一)
  15. fiddle简单使用
  16. 云知梦php视频教程百度云_php学习笔记(里面是自己看云知梦php视频时的思考和笔记)(一)...
  17. 简单介绍一下常用的几种无位置传感器的控制方式
  18. linux 发现sata硬盘的过程 命令名码 identify,SATA命令之security
  19. 蛇年最后一篇以及新春之礼:高效开发视频讲座下载
  20. 2021年东华高级中学高考成绩查询,东莞市最好的三所高中,成绩一看便知,你知道几所...

热门文章

  1. 【Redis】Redis 事务
  2. 【Spring】Spring 中的bean 和我们java中的bean有什么区别以及spring 模拟实现
  3. 60-170-040-使用-Time-Flink时间系统系列之实例讲解-如何做定时输出
  4. Elasticsearch 写入优化记录,从3000到8000/s
  5. 。。。,带着这三点疑问,让我们层层深入的对HTTPS原理进行剖析!
  6. 转化百分比_localPosition与anchoredPosition的转化关系
  7. 台式计算机关机后自行重启,台式机电脑总是自动关机重启该怎么解决?
  8. CentOS 7下设置Docker代理(Linux下Systemd服务的环境变量配置)
  9. UOJ#386. 【UNR #3】鸽子固定器(链表)
  10. SpringBoot | 第十四章:基于Docker的简单部署