Java8自定义函数式编程接口和便捷的引用类的构造器及方法
什么是函数编程接口?
约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equals),不算是函数式接口的方法。
被@FunctionalInterface注解该接口,没有该注解的接口满足约束也行。
在Java8中,满足下面任意一个条件的接口都是函数式接口:
- 被@FunctionalInterface注释的接口,满足函数式接口的约束。
- 没有被@FunctionalInterface注释的接口,但是满足函数式接口的约束。
- @函数式的约束:
- 接口有且只能有个一个抽象方法,只有方法定义,没有方法体。
- 在接口中覆写Object类中的public方法,不算是函数式接口的方法。
- 在接口中的default方法,不算是函数式接口的方法。
- 在接口中的static方法,不算是函数式接口的方法。
自定义一个函数式编程接口
/**
* 自定义一个函数式编程接口
* 函数式编程只有一个抽象方法,所以默认的是实现的是这个抽象方法
* @param <T>
* @param <R>
*/
@FunctionalInterface
public interface CalcFunctionInterface<T, R> {
/**
* 计算t1和t2
*
* @param t1
* @param t2
* @return
*/
R calc(T t1, T t2);
}
传入不同calc函数实现的对象,进行调用
相当于以前创建CalcFunctionInterface的匿名类,重写了calc方法(由于只有一个抽象方法,所以默认就是calc方法)
/**
* 相当于一个类实现了CalcFunction接口中的唯一一个函数calc
* 然后在利用多态,调用calc函数,传入两个参数,进行计算
*/
@Test
public void add(){
CalcFunctionInterface<Integer, Integer> add = (t1, t2) -> t1+t2;
Integer calc = add.calc(2, 3);
System.out.println(calc);
//
}
传入一个匿名类对象,进行方法调用calc
@Test
public void multiply(){
// 相当于通过匿名类的形式传入一个实现了CalcFunctionInterface接口的子类对象,重写了该接口的方法
Integer calc = FunctionalInterfacesTest.calc(2, 3, (t1, t2) -> t1 * t2);
System.out.println(calc);
//
} /**
* 接受了一个对象,利用对象的calc方法计算
*/
public static Integer calc(Integer i1, Integer i2, CalcFunctionInterface<Integer, Integer> calc){
return calc.calc(i1,i2);
}
便捷的引用类的构造器及方法
一个Convert接口
@FunctionalInterface
public interface Convert<F, T> {
T convert(F from);
}
lambda表达式的形式重写该函数式编程的唯一接口
@Test
public void testLambda(){
Convert<String, Integer> stringIntegerConvert = (from -> Integer.valueOf(from));
Integer convert = stringIntegerConvert.convert("123");
System.out.println(convert);
//
}
下面使用"::"运算符更精简
静态方法
@Test
public void testStaticMethod(){
Convert<String, Instant> stringInstantConvert = Instant::parse;
Instant convert = stringInstantConvert.convert("2019-04-25T16:09:03.852Z");
System.out.println(convert);
// 2019-04-25T16:09:03.852Z
}
实例方法
/**
* 实例对象的方法
*/
@Test
public void testObjectMethod(){
Something something = new Something();
Convert<String, String> startsWith = something::startsWith;
String convert = startsWith.convert("123");
System.out.println(convert);
//
}
class Something {
public String startsWith(String s) {
return String.valueOf(s.charAt(0));
}
}
对象的构造方法
/**
* 调用对象的构造方法
*/
@Test
public void testConstructor(){
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Chris", "Paul");
System.out.println(person);
// Person(firstName=Chris, lastName=Paul)
}
/**
* Person 工厂
*/
@FunctionalInterface
public interface PersonFactory<P extends Person> {
P create(String firstName, String lastName);
}
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
class Person {
private String firstName;
private String lastName;
}
Java8的内置函数式编程接口
https://juejin.im/post/5c7d1254e51d45720f72264c
https://www.cnblogs.com/theRhyme/p/10774341.html
https://www.exception.site/java8/java8-new-features
Java8自定义函数式编程接口和便捷的引用类的构造器及方法的更多相关文章
- Java8内置的函数式编程接口应用场景和方式
首先,我们先定义一个函数式编程接口 @FunctionalInterface public interface BooleanFunctionalInterface<T> { boolea ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- 快速掌握Java8 Stream函数式编程技巧
函数式编程优势 "函数第一位",即函数可以出现在任何地方. 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值. 让代码的逻辑更清晰更优雅. 减少了可变量(Immutabl ...
- 谈一谈Java8的函数式编程 (三) --几道关于流的练习题
为什么要有练习题? 所谓学而不思则罔,思而不学则殆,在系列第一篇就表明我认为写博客,既是分享,也是自己的巩固,我深信"纸上得来终觉浅,绝知此事要躬行"的道理,因此之后的几篇博 ...
- java8 函数式编程接口
java8 函数式接口java.util.function.* @param T 入参类型 @param R 出参类型 1. Function <T,R> 例: Function<I ...
- java8 lambda 函数式编程
package com.atguigu.java8; import java.util.ArrayList; import java.util.Comparator; import java.util ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...
- Java8 函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- Java8函数式编程探秘
引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...
随机推荐
- Element UI toggleRowExpansion用法
背景: 官方说明文档没有具体代码示例 一.官方文档 方法名: toggleRowExpansion 说明: 用于可展开表格,切换某一行的展开状态,如果使用了第二个参数,则是设置这一行展开与否(expa ...
- ubuntu设置 SSH 通过密钥对登录
1. 制作密钥对 首先在服务器上制作密钥对.登录到打算使用密钥登录的账户,然后执行以下命令: [root@host ~]$ ssh-keygen <== 建立密钥对 Generating pub ...
- java中的线程中断
线程会根据中断标志位 自行了断自己 https://www.cnblogs.com/yangming1996/p/7612653.html 如何停止线程 1.设置中断标识位 2.sleep时设置中断标 ...
- ubuntu16.04 pip install scrapy 报错处理
Failed building wheel for Twisted inculde/site/python3./Twisted failed with error code in tmp/pip-in ...
- 在思科模拟器上配置AAA认证
1.实验拓扑 2.检测用户之间连通性 PC2 ping PC-A PC-C ping PC-A 3.路由及服务器配置 R1:在路由器R1上配置一个本地用户账号并且利用本地AAA通过console ...
- Python【每日一问】09
问:请分别写一段Python代码实现一下功能: (1)计算一个文件中的大写字母数量 (2)输入中文,返回相应的拼音,并写入文件中 答: (1)计算一个文件中的大写字母数量 file_name = &q ...
- WinSDK-键盘消息
一 参考url http://www.cnblogs.com/5iedu/p/4656178.html http://blog.csdn.net/yiyefangzhou24/article/deta ...
- AD域控Dsquery查询命令实列
注:请以管理员的身份运行cmd程序,要不然某些命令不生效 AD域控Dsquery查询命令实列 查询技术支持二部的所有用户 dsquery user OU=技术支持二部,OU=技术部, ...
- Shiro的FormAuthenticationFilter登陆成功不跳转
http://jinnianshilongnian.iteye.com/blog/2024723 张开涛的这个配置信息有误,导致默认authc登陆成功后无法跳转 FormAuthenticationF ...
- VMware 12 安装 Windows server 2008 系统
一.准备工作 安装了VMware 12 的PC 准备windows server 2008 的ISO操作系统文件 官网地址:https://www.microsoft.com/en-us/downl ...