java function void_Java8中你可能不知道的一些地方之函数式接口实战

0360c8141433d63df3d4e7d5b4d9fe9f.png

什么时候可以使用 Lambda?通常 Lambda 表达式是用在函数式接口上使用的。从 Java8 开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 java8 引入 @FunctionalInterface 注解声明该接口是一个函数式接口。

一、语法抽象方法有且仅有一个

接口使用 @FunctionalInterface 注解进行标注

接口中可以存在默认方法和静态方法实现

如下形式:

/**

* 定义函数式接口

* 接口上标注@FunctionalInterface 注解

*/

@FunctionalInterface

public interface ICollectionService{

/**

* 定义打印方法

*/

void print();

}

在 Java8 以前,已有大量函数式接口形式的接口(接口中只存在一个抽象方法),只是没有强制声明。例如 java.lang.Runnable,java.util.concurrent.Callable,java.security.PrivilegedAction,java.io.FileFilter 等,Java8 新增加的函数接口在 java.util.function 包下,它包含了很多类,用来支持 Java 的函数式编程,该包中的函数式接口如下:d6fcb02eb2ab4f5c822183316591bfde.png

对于 Java8 中提供的这么多函数式接口,开发中常用的函数式接口有以下几个 Predicate,Consumer,Function,Supplier。

二、函数式接口实例

2.1 Predicate

java.util.function.Predicate接口定义了一个名叫 test 的抽象方法,它接受泛型 T 对象,并返回一个 boolean 值。在对类型 T 进行断言判断时,可以使用这个接口。通常称为断言型接口 。「字符串判空」

Predicate p01=(str)->str.isEmpty()||str.trim().isEmpty();

/**

* 测试传入的字符串是否为空

*/

System.out.println(p01.test(""));

System.out.println(p01.test(" "));

System.out.println(p01.test("admin"));「用户合法性校验」

接口静态方法完成手机号合法校验功能,方法返回函数式接口 Predicate

public interface MyStringInter{

public final  String checkPhone= "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(16[0-9])" +

"|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";

/**

* 用户手机格式合法性

*     返回L函数式接口Predicate 的实现 Lambda表达式

* @return

*/

static Predicate checkPhone(){

return (e)-> {

return Pattern.compile(checkPhone).matcher(e).matches();

};

}

}

2.2 Consumer

java.util.function.Consumer接口定义了一个名叫 accept 的抽象方法,它接受泛型 T,没有返回值(void)。如果需要访问类型 T 的对象,并对其执行某些操作,可以使用这个接口,通常称为消费型接口。「热销商品展示」

/**

热销商品测试数据

*/

Goods g01=new Goods(1,"iPad 2018款",3000,180, BigDecimal.valueOf(2300));

Goods g02=new Goods(6,"小米平板4",5000,600, BigDecimal.valueOf(1900));

Goods g03=new Goods(9,"微软 Surface Pro 6",100,50, BigDecimal.valueOf(8500));

Goods g04=new Goods(20,"华为 荣耀平板5",1600,480, BigDecimal.valueOf(1500));

List goods= Arrays.asList(g01,g02,g03,g04);

//Consumer 实现集合数据输出 Lambda替代匿名函数 实现Consumer接口

goods.forEach(g->{

System.out.println(g);

});

2.3 Function

java.util.function.Function 接口定义了一个叫作 apply 的方法,它接受一个泛型 T 的对象,并返回一个泛型 R 的对象。如果需要定义一个 Lambda,将输入的信息映射到输出,可以使用这个接口(比如提取苹果的重量,或把字符串映射为它的长度),通常称为功能型接口。「用户密码 Base64 编码」

// 实现用户密码 Base64加密操作

Function f01=(password)->Base64.getEncoder().encodeToString(password.getBytes());

// 输出加密后的字符串

System.out.println(f01.apply("123456"));

2.4 Supplier

java.util.function.Supplier接口定义了一个 get 的抽象方法,它没有参数,返回一个泛型T的对象,这类似于一个工厂方法,通常称为功能型接口。「外部Properties文件读取」

public static Properties readFile(String fileName){

Supplier supplier = () -> {

try {

InputStream is = TestCase04.class.getClassLoader().getResourceAsStream(fileName);

Properties prop = new Properties();

prop.load(is);

return prop;

} catch (IOException e) {

e.printStackTrace();

return null;

}

};

return supplier.get();

}

三、高阶函数bd73603bc56f740be64cf8cb300397fd.png

Java8 中函数式接口中方法允许函数接口作为方法形参传入,同时方法的结果为函数接口,从而实现链式调用操作,就像俄罗斯套娃那样,当把套娃一个个打开时,发现还有一个同样的小套娃在里面,最终发现最里面的一个也是一个完整的套娃玩具,此时的高阶函数是不是跟套娃有着惊人的相似之处呢。「多页面转发」

String action = "";

Predicate p01 = (a) -> StringUtils.isBlank(a);

/**

* 如果action 为空 或 index 或 main 转发到网站主页面

* 链式判断 方法结果仍然为一个函数

*/

if (p01.or((a) -> a.equals("index")).or((a) -> a.equals("main")).test(action)) {

System.out.println("网站主页面...");

} else {

System.out.println("其他页面...");

}「多条件排序」

这里以商品数据为例,按商品销量、评论排序,如果销量一致按照商品评论数排序

/**

* 实际开发数据通常从数据库获取

* 这里使用测试数据

*/

Goods g01=new Goods(1,"小米9",1789,200, BigDecimal.valueOf(2500));

Goods g02=new Goods(2,"华为Mate20",5000,3000, BigDecimal.valueOf(7000));

Goods g03=new Goods(3,"OPPO R17",2000,2827, BigDecimal.valueOf(1500));

Goods g04=new Goods(4,"魅族 Note9",2000,1600, BigDecimal.valueOf(1600));

Goods g05=new Goods(5,"一加6T",8000,5000, BigDecimal.valueOf(3500));

List goods= Arrays.asList(g01,g02,g03,g04,g05);

// 销量 与 评论排序 高阶函数使用

Comparator comparator = (g1,g2)->g1.getSale()-g2.getSale();

goods.sort(comparator.thenComparing(Comparator.comparing(g3 -> g3.getComment())));

goods.forEach((g)->System.out.println(g));

高阶函数应用场景较多(这里查看源码相关高阶函数方法),如 Optinal 接口 filter、map 、orElseGet 等方法,Stream 流操作等基本都会用到 Predicate, Consumer, Supplier, Function 等接口。

四、函数式接口优势与应用场景

函数式接口的引入,结合 Lambda 的使用,消除的匿名函数繁琐的代码,使得代码结构简洁、紧凑,第二点就是函数式接口中使用高阶函数,可以很方便的实现链式调用,代码清晰简洁,同时引入的一种新的开发思想-函数式编程,对于开发者来说只需要关注函数的规则设计实现即可。

对于函数式接口应用,后续介绍到的 Optinal、Stream 相关方法对于数据处理的使用频率较高,同时也是构成函数式编程的核心内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jvm内存地址_JVM--Java内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如图:1.程序计数器可以看作是当前线程所执行的字节码的行号指示器,通俗的讲就是用来指示执行哪条指令的。为了线程切换后能恢复到正确的执行位置Java多线程是…

java情人节_情人节写给女朋友Java Swing代码程序

马上又要到情人节了,再不解风情的人也得向女友表示表示。作为一个程序员,示爱的时候自然也要用我们自己的方式。这里给大家上传一段我在今年情人节的时候写给女朋友的一段简单的Java Swing代码,主要定义了一个对话框,让女友选择是…

java web filter链_filter过滤链:Filter链是如何构建的?

在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(也叫过滤器链)。Filter链用FilterChain对象来表示,FilterChain对象中…

java final static_Java基础之final、static关键字

一、前言关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高。接口中、常量、静态方法等等。但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来。下面,对这两个关键字的常见用法…

java语言错误的是解释运行的_Java基础知识测试__A卷_答案

考试宣言:同学们, 考试考多少分不是我们的目的! 排在班级多少的名次也不是我们的初衷!我的考试的目的是要通过考试中的题目,检查大家在这段时间的学习中,是否已经把需要掌握的知识掌握住了,如果哪道题目你不会做,又或者做错了, 那么不用怕, 考完试后, 导师讲解的时候你要注意听…

java 持续集成工具_Jenkins-Jenkins(持续集成工具)下载 v2.249.2官方版--pc6下载站

Jenkins是一款基于java开发的持续集成工具,是一款开源软件,主要用于监控持续重复的工作,为开发者提供一个开发易用的软件平台,使软件的持续集成变成可能。。相关软件软件大小版本说明下载地址Jenkins是一款基于java开发的持续集成…

java中线程调度遵循的原则_深入理解Java多线程核心知识:跳槽面试必备

多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。本文从基础概念开始到最后的并…

java类构造方法成员方法练习_面向对象方法论总结 练习(一)

原标题:面向对象方法论总结 & 练习(一)学习目标1.面向对象与面向过程2.类与对象的概念3.类的定义,对象的创建和使用4.封装5.构造方法6.方法的重载内容1.面向对象与面向过程为什么会出现面向对象反分析方法?因为现实世界太复杂多变&#x…

mysql 统计查询不充电_MySql查询语句介绍,单表查询,来充电吧

mysql在网站开发中,越来越多人使用了,方便部署,方便使用。我们要掌握mysql,首先要学习查询语句。查询单个表的数据,和多个表的联合查询。下面以一些例子来先简单介绍下单表查询。操作方法01首先看下我们例子用到的数据表&#xff…

MySQL线上优化_线上MySQL千万级大表,如何优化?

前段时间应急群有客服反馈,会员管理功能无法按到店时间、到店次数、消费金额进行排序。经过排查发现是 SQL 执行效率低,并且索引效率低下。图片来自 Pexels应急问题商户反馈会员管理功能无法按到店时间、到店次数、消费金额进行排序,一直转圈…

php创建表设置编码,教您在Zend Framework里如何设置数据库编码以及怎样给数据表设定前缀!...

当我们在开发项目时..大家都会遇到一个问题就是:数据库的编码问题.当然我们不用Zend Framework做为项目开发的框架时..我们可以很快,很容易搞定这个小问题..但是当我们要使用Zend Framewok开发项目时..我们可能一时会不知道如何解决这个小问题..比如我就是这样的人..在开发这个…

python 怎么将数组转为列表_怎么将视频转为GIF动态图 表情包怎么制作

说到GIF,大家应该都不陌生了吧!尤其是在聊天中使用较多,似乎一言不合就开启了斗图模式,但是我们平时使用的GIF一般都是软件中自带的,其实自己制作也是很方便的,而且会发现很有趣,不但可以直接录…

proteus里面没有stm32怎么办_嵌入式单片机之stm32串口你懂了多少!!

stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm32的视频资料便于学习参考。点击…

tomcat不能解析php,tomcat不支持php怎么办

tomcat不支持php的解决办法:首先将“PHP/Java Bridge”下的相关文件复制到tomcat的lib目录下;然后修改tomcat安装目录下conf文件夹里的“web.xml”文件;最后重启tomcat即可。java开发者都知道,tomcat是用来部署java web项目的。这…

c++ dicom图像切割_【高训智造】原创专业课堂第225期--定位滑座的线切割加工

原标题:【高训智造】原创专业课堂第225期--定位滑座的线切割加工欢迎来到【高训智造】原创专业课堂第225期,本期由郭沃沛老师给大家带来线切割小课堂。定位滑座的线切割加工郭沃沛1零件图如图1所示为定位滑座零件图,其材料为45钢,…

c iostream.源码_通达信指标公式源码精准买卖主图指标公式免费分享

V0:EMA(C,5),COLOR00FF66;V1:EMA(C,10),COLOR00FF66;V2:EMA(C,15),LINETHICK2,COLORFFFFFF;V3:EMA(C,30);V4:EMA(C,60),COLOR3366FF;年线:EMA(C,90),COLORBLUE;M1:1000*V1/V4<1015 AND 1000*V1/V4>975;M2:1000*V2/V4<1020 AND 1000*V2/V4>980;M3:1000*V3/V4<101…

4am永远 鼠标按键设置_4AM称霸PCL和PEL 绝地求生与和平精英的双端冠军 | 电玩巴士...

在《绝地求生》PCL秋季赛&#xff0c;4AM高分碾压全场斩获冠军&#xff1b;在手游和平精英PEL联赛上4AM战队再度重拳出击荣获S3总冠军。在同一时间&#xff0c;4AM战队实现了端游与手游双冠王的神迹&#xff01;要说国内第一大逃杀电竞俱乐部&#xff0c;4am自认第二&#xff0…

checkA.php,php window平台模拟checkdnsrr函数检测_php

在php的系统函数中有一个checkdnsrr函数&#xff0c;该函数的作用是根据一个给定的host name(域名)或者IP地址检查它是否有DNS记录&#xff0c;目的就是检验它是否真实存在。但是该函数仅可以在linux系统下使用&#xff0c;并不支持windows平台。下面是网上搜集到的一个hack的方…

oracle临时表经常被锁_【赵强老师】Oracle数据库的存储结构

Oracle的存储结构分为&#xff1a;物理存储结构和逻辑存储结构。一、物理存储结构&#xff1a;指硬盘上存在的文件数据文件(data file)一个数据库可以由多个数据文件组成的&#xff0c;数据文件是真正存放数据库数据的。一个数据文件就是一个操作系统文件。数据库的对象(表和索…

h5 nan_手把手教你将H5游戏打包成快游戏

H5游戏可以通过快应用的web组件快速打包成快游戏&#xff0c;打包上架后的快游戏&#xff0c;只要原H5游戏的url不发生变动&#xff0c;快游戏就不需要做更新&#xff0c;维护工作量小。使用快应用IDE&#xff0c;打包快游戏的操作很简单。访问官网安装开发工具&#xff0c;在P…