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 ...
随机推荐
- Python学习基本小练习
对于python的10个小练习做下笔记 1.使用while循环输入1 2 3 4 5 6 8 9 10...自己写的代码如下: num1 = 0 while num1 < 10: num1 = ...
- MQTT研究之EMQ:【JAVA代码构建X509证书】
这篇帖子,不会过多解释X509证书的基础理论知识,也不会介绍太多SSL/TLS的基本信息,重点介绍如何用java实现SSL协议需要的X509规范的证书. 之前的博文,介绍过用openssl创建证书,并 ...
- mac mongodb安装
1.前往官网下载.tgz文件 2.解压 tar zxf mongo压缩文件 3.配置环境变量:MAVEN_HOME & bin路径 4.创建data & log文件夹 5.执行安装命令 ...
- WebApi Owin OAuth
Microsoft.Owin.Host.SystemWeb Owin Microsoft.Owin Microsoft.Owin.Diagnostics Owin Micros ...
- 多态,封装,反射,类内置attr属性,os操作复习
1.多态 #多态 多态是指对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们具体的类 运行时候,多种实现 反应运行时候状态 class H2O: def __init__(self,nam ...
- upstream timed out (10060: A connection attempt failed because the connected party did not properly respond
openresty 错误日志报错内容: // :: [error] #: * upstream timed : A connection attempt failed because the conn ...
- 安卓APP环境搭建
https://www.cocos.com/creator 下载2.0.8 安装的时候选择原生环境 下载SDK:http://tools.android-studio.org/index.php/sd ...
- Spring Data Solr相关配置
1.增加Maven POM文件的存储库:pom配置如下: <repositories> <repository> <id>spring-milestone</ ...
- sudo 取消密码
通常我们并不以root身份登录,但是当我们执行某些命令 (command)时需要用到root权限,我们通常都是用"sudo command"来执行command.由于使用Ubunt ...
- Linux(CentOS)用户修改密码有效期(chage命令)
Linux设置用户密码的有效期限 解决: 先查看密码过期时间,现在是90天 1 2 3 4 5 6 7 8 [root@01 ~]# chage -l testuser Last password c ...