优雅的将一个对象的集合转化成另一个对象的集合
2018-03-26 09:27
330 查看
编码如同写作,应当追求字迹工整,逻辑清晰,分段合理且言简意赅。其他的先不谈,如何做到言简意赅呢? 答案就是用尽可能短的代码去实现需求,其实也不然,简短的代码可能对于新手不太友好,但大多情况下,尽可能短的代码总是更有优势的。下面结合实际场景举个栗子简要分析一波 。
在实际的应用场景中,经常会遇到需要 将另一个对象的集合转化为另一个集合的对象 的需求,比如:现在有一个OrderDetail(订单详情)对象的集合 OrderDetailList,OrderDetail对象的结构如下:
下单的话,需要根据这个集合来扣除库存,Service层的方法签名如下:
其中 CartDTO 对象结构如下:
那么仅需提取OrderDetail中的productId以及productQuantity属性,将其转换为CartDTO的集合即可,那么问题来了,怎样才能优雅的完成这个简单的工作呢?最普通的方式无非就是遍历orderDetailList中的每个元素,将其转换成CartDTO对象,并且存入集合中 :
嗯,其实这样也挺简短的。还有更优雅的方式吗? 答案是肯定的,使用 Java8 的Stream api :
首先调用stream()方法,将其转换为流
在流上调用map方法将其转换为另一个对象流
调用collect方法,将对象流收集起来转化为集合
如果属性有很多个需要转换的话可以参考我的另外一篇博客
java对象属性复制
在实际的应用场景中,经常会遇到需要 将另一个对象的集合转化为另一个集合的对象 的需求,比如:现在有一个OrderDetail(订单详情)对象的集合 OrderDetailList,OrderDetail对象的结构如下:
package cn.echo0.ordersystem.pojo; import lombok.Data; import javax.persistence.Entity; import javax.persistence.Id; import java.math.BigDecimal; /** * Author : Ech0 * Email : ech0.extreme@foxmail.com * Time : 10/03/2017 02:37 PM */ @Entity @Data public class OrderDetail { @Id private String detailId; /** 订单id */ private String orderId; /** 商品id */ private String productId; /** 商品名称 */ private String productName; /** 商品价格*/ private BigDecimal productPrice; /** 商品数量 */ private Integer productQuantity; /** 商品图片连接 */ private String productIcon; }
下单的话,需要根据这个集合来扣除库存,Service层的方法签名如下:
public void decreaseStock(@NotNull List<CartDTO> carts) throws ServiceException
其中 CartDTO 对象结构如下:
package cn.echo0.ordersystem.dto; import lombok.Data; /** * Author : Ech0 * Email : ech0.extreme@foxmail.com * Time : 10/04/2017 10:23 AM */ /** * 购物车 */ @Data public class CartDTO { /** * 商品id */ private String productId; /** * 商品数量 */ private Integer productQuantity; public CartDTO(String productId, Integer productQuantity) { this.productId = productId; this.productQuantity = productQuantity; } }
那么仅需提取OrderDetail中的productId以及productQuantity属性,将其转换为CartDTO的集合即可,那么问题来了,怎样才能优雅的完成这个简单的工作呢?最普通的方式无非就是遍历orderDetailList中的每个元素,将其转换成CartDTO对象,并且存入集合中 :
List<CartDTO> cartDTOList = new ArrayList<>(); for (OrderDetail item : orderDetailList){ cartDTOList.add(new CartDTO(item.getProductId(),item.getProductQuantity())); }
嗯,其实这样也挺简短的。还有更优雅的方式吗? 答案是肯定的,使用 Java8 的Stream api :
List<CartDTO> cartDTOList = orderDetailList.stream() .map(e -> new CartDTO(e.getProductId(), e.getProductQuantity())) .collect(Collectors.toList());
首先调用stream()方法,将其转换为流
在流上调用map方法将其转换为另一个对象流
调用collect方法,将对象流收集起来转化为集合
如果属性有很多个需要转换的话可以参考我的另外一篇博客
java对象属性复制
相关文章推荐
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 优雅的将一个对象的集合转化成另一个对象的集合
- 集合怎么能转化成单个对象呢!只能从集合中取一个变成单个的对象!
- 第十章 Scala 容器基础(十四):使用map把一个集合转化为另一个
- java一个对象根据另一个集合的顺序进行排序
- eco建模对象视图中:在一个类的过程中运用建立另一个相关联的类并处理
- List集合中删除属性(一个或者多个属性)相同的对象返回List且根据对象属性进行排序输出
- 在 C#,快速复制一个对象的值给另一个对象(常常用于父类与子类之间相互复制)
- 如何 创建一个model对象保存到LIST集合里面并取出来