函数式编程
函数式编程思想
它属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数式编程比面向对象的优势就是粒度更小,生命周期更短。减少bug的有效途径就是减少变量的生命周期,缩小模块的粒度。
-------------------------------------------------------------------------------------摘自函数式编程思想
Lambda表达式
概述
Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口,它是函数式编程思想的一个重要体现。
下述所有测试代码源码地址:https://gitee.com/ArnoldSu/functionalProgramming.git
基本格式
(参数列表)->{代码}
初始化之后所有演示代码需要用到的数据集合
public static User createUser() {
return new User()
.setId(RandomUtil.randomLong())
.setAge(RandomUtil.randomInt(0, 100))
.setName(RandomUtil.randomString("澄邈德泽海超海阳海荣海逸海昌瀚钰瀚文涵亮涵煦明宇涵衍浩皛浩波浩博浩初浩宕浩歌浩广浩邈浩气浩思浩言鸿宝鸿波鸿博鸿才鸿畅鸿畴鸿达鸿德鸿飞鸿风鸿福鸿光鸿晖鸿朗鸿文鸿轩鸿煊鸿骞鸿远鸿云鸿哲鸿祯鸿志鸿卓嘉澍光济澎湃彭泽鹏池鹏海浦和浦泽瑞渊越泽博耘德运辰宇辰皓辰钊辰铭辰锟辰阳辰韦辰良辰沛晨轩晨涛晨濡晨潍鸿振吉星铭晨起运运凡运凯运鹏运浩运诚运良运鸿运锋运盛运升运杰运珧运骏运凯运乾维运运晟运莱运华耘豪星爵星腾星睿星泽星鹏星然震轩震博康震震博振强振博振华振锐振凯振海振国振平昂然昂雄昂杰昂熙昌勋昌盛昌淼昌茂昌黎昌燎昌翰晨朗德明德昌德曜范明飞昂高旻晗日昊然昊天昊苍昊英昊宇昊嘉昊明昊伟昊硕昊磊昊东鸿晖鸿朗华晖金鹏晋鹏敬曦景明景天景浩俊晖君昊昆琦昆鹏昆纬昆宇昆锐昆卉昆峰昆颉昆谊昆皓昆鹏昆明昆杰昆雄昆纶鹏涛鹏煊曦晨曦之新曦旭彬旭尧旭鹏旭东旭炎炫明宣朗学智轩昂彦昌曜坤曜栋曜文曜曦曜灿曜瑞智伟智杰智刚智阳昌勋昌盛昌茂昌黎昌燎昌翰晨朗昂然昂雄昂杰昂熙范明飞昂高朗高旻德明德昌德曜智伟智杰智刚智阳瀚彭旭炎宣朗学智昊然昊天昊苍昊英昊宇昊嘉昊明昊伟鸿朗华晖金鹏晋鹏敬曦景明景天景浩景行景中景逸景彰昆鹏昆明昆杰昆雄昆纶鹏涛鹏煊景平俊晖君昊昆琦昆鹏昆纬昆宇昆锐昆卉昆峰昆颉昆谊轩昂彦昌曜坤曜文曜曦曜灿曜瑞曦晨曦之新曦鑫鹏旭彬旭尧旭鹏旭东浩轩浩瀚浩慨浩阔鸿熙鸿羲鸿禧鸿信泽洋泽雨哲瀚胤运佑运允晨运恒运发云天耘志耘涛振荣振翱中震子辰晗昱瀚玥瀚昂瀚彭景行景中景逸景彰绍晖文景曦哲永昌子昂智宇智晖晗日晗昱瀚昂昊硕昊磊昊东鸿晖绍晖文昂文景曦哲永昌子昂智宇智晖浩然鸿运辰龙运珹振宇高朗景平鑫鹏昌淼炫明昆皓曜栋文昂治汇", 2))
.setNickname(RandomUtil.randomString("风雨踏梦行 樱花味女孩 柠檬泪 日之夕矣 半世浮生 逆水寒 雨后初晴 陌路 不缺友人 听风说旧人 舟不渡我 哑剧 沫丶白色控 傻子快来~ 厌己 森屿海巷 断桥再见 坚毅之梦 щǒ冇寎 遗忘 梦想的翅膀 捂着心脏说胃疼 南巷孤猫i 手捧阳光 樱花涵 指尖微凉° 你给的承诺丶早已泛黄 尐懒蟲ゞ 坚强的另一个名字叫苦撑 孤街浪人 瞌睡虫 薄荷凉 孤魄 热巴 温柔似你眉眼 离心咒ゝ 那一抹浅笑隱藏忧伤 盛夏北梦初心未改 幸福式梦想※ 唯念 依然血红。 沦陷的痛", 5))
.setSex(RandomUtil.randomInt(0, 2))
.setDep(createDepartment());
}
public static List<Department> createDepartment() {
List<Department> departments = new ArrayList<Department>();
int i = RandomUtil.randomInt(1, 4);
for (int j = 0; j < i; j++) {
departments.add(new Department().setId(RandomUtil.randomLong())
.setName(RandomUtil.randomString("人事技术前台前端后端", 2))
.setCode(RandomUtil.randomInt(1, 10000))
.setParentId(RandomUtil.randomLong(1, 10000))
);
}
return departments;
}
public static List<User> initUsers = new ArrayList<User>();
@BeforeAll
public static void init() {
for (int i = 0; i < 10; i++) {
initUsers.add(createUser());
}
}
测试lambda表达式输出打印
/**
* description 测试lambda表达式输出打印用户信息
*
* @param
* @return void
* @author Arnold
* @date 2022/6/7
**/
@Test
public void Test() {
initUsers.forEach(user -> System.out.println(user.toString()));
}
Lambda省略规则
- 不需要声明参数类型,编译器可以统一识别参数值。
- 一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 如果主体包含了一个语句,就不需要使用大括号。
- 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
Lambda 方法引用
引用数据类型最大的特点是可以进行内存的指向处理,但是在传统的开发之中一直所使用的只是对象引用操作,而jdk1.8以后也提供有方法的引用,即:不同的方法名称可以描述同一个方法(即可以为一个方法定义多个名字,但是要求必须是函数式接口)。如果要进行方法的引用在java里面提供了如下的四种形式
- 引用静态方法: 类名称 :: static方法名称;
- 引用某个实例对象的方法: 实例化对象 :: 普通方法;
- 引用特定类型的方法: 特定类 :: 普通方法;
- 引用构造方法: 类名称 :: new ;