Java8函数式接口以及lambda表达式实践
最近重新深入了解和学习了Java8的函数式接口以及lambda表达式,发现以前写的代码大多都是伪-函数表达式,因此重新精炼了一下的这部分代码,仅供参考,如有更好的方式,欢迎在评论区留言。
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>
这里的做法还是犯了跟上面一条同样的错误,后面调整如下
相关文章
- Java 8 新特性-菜鸟教程 (3) -Java 8 函数式接口
- JDK8新特性_常用函数接口
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
- C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法
- Java接口源码--System和应用程序进程间通信
- postman之接口测试技巧
- Laravel设计RBAC权限管理出API接口
- 微信小程序 - 每隔一段时间请求后端接口获取最新数据,页面每隔一段时间就触发一个函数(实时刷新数据,页面每隔 N 秒自动请求接口数据)让页面每隔一段时间就请求一次接口,详细示例教程可运行示例
- Python+Requests+Pytest+YAML+Allure实现接口自动化
- 2022非常火过postman的一款技术人必备的接口测试神器:Apifox
- 技术分享 | 接口测试常用代理工具
- App接口设计思路
- RestAssured接口自动化学习第一天
- Map在Java 8中增加非常实用函数接口
- 07 Lamda表达式 概念 函数式接口 代码 总结
- PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比
- 什么是函数式接口?
- 【接口测试】IHRM项目实战
- 《C语言接口与实现:创建可重用软件的技术》一导读
- 基于layui的框架模版,采用模块化设计,接口分离,组件化思想
- 8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理
- 使用swig将C/C++代码转为JAVA接口(Windows平台)
- php 调用银联接口 【转载】
- TypeScript函数(与js函数区别、返回值类型、必填参数可选参数默认参数剩余参数、函数重载)、接口(对象形状描述、可选属性只读属性、索引签名任意属性、接口与类型别名的区别、声明合并、接口继承)、类(类的属性和方法、私有字段、存取器、继承、访问控制修饰符、类的方法重载)
- 【历史上的今天】2 月 24 日:乔布斯生日;苹果推出 Thunderbolt 接口;WhatsApp 创始人诞生
- 函数式接口的使用