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 ...
随机推荐
- 图形化SVN管理搭建 subversion edge自行修改密码
参考文章: https://blog.csdn.net/buyaore_wo/article/details/84313467 安装版本: Subversion Edge 5.2.3 (Linux 6 ...
- Office2010安装出现“错误1907”的解决方法(未验证)
http://bbs.pcbeta.com/viewthread-1627988-1-5.html 这个问题我遇到过.解决方法:1.安装时提示错误选择忽略,安装完成后.2.如果能正常使用OFFICE软 ...
- windows github 下载慢 修改hosts
参考:Github访问速度慢和下载慢的解决方法 [Github]windows上访问github慢的解决方法 方法:绕过dns解析,在本地直接绑定host,该方法也可加速其他因为CDN被屏蔽导致访问慢 ...
- [UE4]插值interp
插值 在两个数之间补充一些数,让过渡变得更自然. UE4引擎提供的插值 一.CInterp To:颜色(Color)插值.C:Color,颜色. 二.FInterp To.FInterp To Con ...
- json相关安全问题
前言: 最近经常遇到json的事情,由于不懂所以系统的学习一下,记录此贴. 00x1: JSON是啥?Java Objiect Notaton 谷歌翻译过来就是JS对象标记,是一种轻量级的数据交换格式 ...
- 【原创】Open JDK更换过程及更换后的问题总结与分析
由于2019年1月起Oracle对通用计算以外的应用场景开始收费,综合看来还是主要针对嵌入式的Java应用进行收费,毕竟嵌入式设备的数量是庞大的,可以有数亿元进账. 因Oracle JDK收费,各大公 ...
- Vue 动态路由传值
一.动态路由传值 1.配置动态路由: const routes = [ //动态路由路径参数以:开头 { path: '/Content/:aid', component:Content}, ] 2. ...
- Jmeter使用插件监控服务器资源的使用情况
环境准备 客户端: 1)安装最新版的Jmeter,目前为 Jmeter5.0 2)安装插件管理器:JMeterPlugin jmeter-plugins-manager.jar下载完成之后,将下载的j ...
- 【Python】Elasticsearch和elasticsearch_dsl
官网:https://elasticsearch-py.readthedocs.io/en/master/api.html 官网:https://github.com/elastic/elastics ...
- HTML5 full-screen全屏API
这篇文章纯属记录,非常感谢张鑫旭大神的demo 原文地址: http://www.zhangxinxu.com/study/201210/html5-full-screen-api.html 代码 C ...