Java8函数式接口以及lambda表达式实践
罗列一下遇到可以转换成lamada表达式的场景,仅供参考,如有更好的方式,欢迎在评论区留言。
1.计算订单总金额
订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下
BigDecimal totalAmount = new BigDecimal(0);for (VenditionProduct venditionProduct :
venditionVo.getVenditionProductList()) {
totalAmount = totalAmount.add(venditionProduct.getPrice());
}
用lambda的方式如下
BigDecimal totalPrice = venditionVo.getVenditionProductList().stream().map(VenditionProduct::getPrice).reduce(BigDecimal::add).orElse(BigDecimal.ONE);
2.循环集合组装新的类
面对的场景是更新字段,下面将出现一个更新方法updateNotNull,该方法是一个通用方法,仅更新不为字段null的属性,由于venditionProduct中只允许Product的price和sellAmount属性,因此不能直接将前端传递过来的集合直接进行更新,需要提取这两个属性重新组装成新的类。
比较Low的做法如下(伪-函数表达式)
venditionProductList.forEach(venditionProduct -> {
VenditionProduct newVenditionProduct = new VenditionProduct();
newVenditionProduct.setId(venditionProduct.getId());
newVenditionProduct.setSellAmount(venditionProduct.getSellAmount());
newVenditionProduct.setPrice(venditionProduct.getPrice());
updateNotNull(newVenditionProduct);
});
以下是真-函数表达式
venditionProductList.stream().map(venditionProduct ->
VenditionProduct.build(venditionProduct.getId(), venditionProduct.getSellAmount(), venditionProduct.getPrice()))
.forEach(this::updateNotNull);
3.在枚举中的应用
我们有如下的枚举类
public enum RecordTypeEnum {
/**
* 0为手工入库 1生产入库 2手工出库 4 退货入库
*/
MANUAL_STORE(0),
PRODUCE_STORE(1),
MANUAL_OUT(2),
VENDITION_OUT(3),
REFUND_IN(4),;
private final int type;
RecordTypeEnum(int type) {
this.type = type;
}
}
遇到的场景可能是希望通过type查找对应的枚举值
通常的方式是
public static RecordTypeEnum getRecordTypeEnum(int type) {
for (RecordTypeEnum typeEnum :
RecordTypeEnum.values()) {
if (typeEnum.getType() == type) {
return typeEnum;
}
}
return null;
}
Java8中我们可以这样子做
public static RecordTypeEnum getRecordTypeEnum1(int type) {
return Arrays.stream(RecordTypeEnum.values()).filter(recordTypeEnum -> recordTypeEnum.getType() == type).findFirst().orElse(null);
}
还有我们可能需要获取对应的数组
public String[] getEnumStringArray() {
return Arrays.stream(RecordTypeEnum.values()).map(Enum::name).toArray(String[]::new);
}
4.编写一行的lambda语法有助于提高代码的健壮性(这里的重点不是lambda的使用技巧,但是觉得有必要记录一下)
面对的业务场景是增加生产产品的生产计划表(plan),一张计划表可以有多个产品,一个产品需要一或者多个原料组成,因此关系是一对多对多,下面看一下我最先的写的代码(伪-函数表达式)
、
重点关注最后的一个方法,最初的实现是这样子的

这里的问题有两个,一是简短的 lambda 表达式能提高代码可读性,这是函数式编程的重要好处之一,这里完全忽视了这一点,二是planProduct(产品)和planMaterial(原料)是关联在一起的,也就是说增加原料这个操作,应该封装在增加产品这个操作里面,修改后的代码如下



这里做记录的原因是在将lambda表达式精简成一行代码的同时,需要不断的调整代码的结构,使之朝向更加的稳定健壮的方向发展,原本的代码逻辑虽然过程也易懂,但是又丑又长,担当了太多的任务。
5.根据已知类型集合转换成另一个类型的集合
大致逻辑是获取生产产品相关联的原料(包括规格),实际是上就是需要根据List<ProductMaterail>转换成List<PlanMaterial>

这里的做法还是犯了跟上面一条同样的错误,后面调整如下

未完待续。。。
Java8函数式接口以及lambda表达式实践的更多相关文章
- Java8函数式接口和Lambda表达式
两者关系: Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作 ...
- Java函数式接口与Lambda表达式
什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...
- Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法
1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...
- Java8 学习笔记--函数式接口与lambda表达式的关系
在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方.为了确保函数式接口的 ...
- Java8函数式编程以及Lambda表达式
第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...
- Java 关于函数式接口与Lambda表达式之间的关系
java是一种面向对象的语言,java中的一切都是对象,即数组,每个类创建的实例也是对象.在java中定义的函数或方法不可能完全独立,也不能将方法函数作为参数或返回值给实例. 在java7及以前,我们 ...
- Java8函数式编程和lambda表达式
文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...
- 函数式接口和Lambda表达式
函数式接口(一般标有@FunctionalInterface)就是只定义一个抽象方法的接口. 一个接口,如果满足函数式接口的定义,那么即使不标注为 @FunctionalInterface, 编译器依 ...
随机推荐
- JAVA入门[16]-form表单,上传文件
一.如何传递参数 使用 @RequestParam 可以传递查询参数.例如:http://localhost:8092/category/detail?id=1 @RequestMapping(&qu ...
- OS X第三方类库管理工具cocoapods入门
一.简介 什么是cocoapods?--是OS X和iOS下一个第三方类库管理工具.通过cocoapods,可以为项目添加"Pods"依赖库,并且管理其版本. cocoapods好 ...
- 一位10年Java工作经验的架构师聊Java和工作经验
从事近十年的 JavaEE 应用开发工作,现任阿里巴巴公司系统架构师.对分布式服务架构与大数据技术有深入研究,具有丰富的 B/S 架构开发经验与项目实战经验,擅长敏捷开发模式.国内开源软件推动者之一, ...
- 我在Windows下的第一个Shellcode
纪念我的第一个Shellcode(XP SP3, VC6): 1.获取MessageBoxA(ASCII)的静态地址 2.编写汇编代码调试,获取对应的机器码(注意字符串由栈顶向栈底生长,push由栈底 ...
- 【CSS3】透明度opacity与rgba()区别、光标cursor、display、轮廓outline与margin及border区别、em和rem区别
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- KVM(二):KVM应用
++++++++++++++++++++++++++++++创建和拍摄快照++++++++++++++++++++++++++++++++++ KVM快照方法常用的是qemu-img snapshot ...
- html5 canvas画布尺寸与显示尺寸
我在用canvas制作画板时,遇到了绘图位置和鼠标位置不一致的问题,所以今天查阅了一下资料,解决了这个问题. canvas绘图原理 在Canvas元素的内部存在一个名为2d渲染环境(2d rederi ...
- git push的用法
git push <远程仓库名> <本地分支名>:<远程分支名>
- 比较日期大小以及获取select选中的option的value
原生JavaScript如何获取select选中的value // 1. 拿到select对象 const selectObject = document.getElementById('test') ...
- Zabbix自动发现监控Tomcat进程
1.编辑自动发现脚本 自动发现脚本只支持JSON格式 #!/usr/bin/env python # -*- coding:utf-8 -*- import commands import psuti ...