点击上方"程序员蜗牛g",选择"设为星标"跟蜗牛哥一起,每天进步一点点
程序员蜗牛g大厂程序员一枚 跟蜗牛一起 每天进步一点点32篇原创内容**公众号
我们有多个异构数据源,需要转换成统一的结构 StandardItem
,如下:
vbnet
class StandardItem {
private String name;
private BigDecimal amount;
private LocalDate date;
}
以前是这么写的:
less
List<StandardItem> fromA = sourceA.stream()
.map(a -> new StandardItem(a.getTitle(), a.getPrice(), a.getCreateDate()))
.collect(Collectors.toList());
List<StandardItem> fromB = sourceB.stream()
.map(b -> new StandardItem(b.getName(), b.getValue(), b.getTime().toLocalDate()))
.collect(Collectors.toList());
复制粘贴不可怕,可怕的是需求一改,三处都得重写。
升级:Function 解耦结构映射
scss
Function<SourceA, StandardItem> mapperA = a ->
new StandardItem(a.getTitle(), a.getPrice(), a.getCreateDate());
Function<SourceB, StandardItem> mapperB = b ->
new StandardItem(b.getName(), b.getValue(), b.getTime().toLocalDate());
public <T> List<StandardItem> mapToStandard(List<T> raw, Function<T, StandardItem> mapper) {
return raw.stream().map(mapper).collect(Collectors.toList());
}
调用:
ini
List<StandardItem> listA = mapToStandard(sourceA, mapperA);
List<StandardItem> listB = mapToStandard(sourceB, mapperB);
这种方式的好处不止是抽象,而是:你的逻辑粒度变小了、可组合性变高了、单测也变得容易写了。
项目里我们经常遇到"策略 + 模板"模式,例如不同计价策略:
csharp
interface PricingStrategy extends BiFunction<BigDecimal, Integer, BigDecimal> {}
实现:
ini
PricingStrategy defaultStrategy = (price, qty) -> price.multiply(BigDecimal.valueOf(qty));
PricingStrategy discountStrategy = (price, qty) -> {
BigDecimal total = price.multiply(BigDecimal.valueOf(qty));
return qty >= 10 ? total.multiply(BigDecimal.valueOf(0.9)) : total;
};
统一封装:
scss
public BigDecimal calculate(List<OrderItem> items, PricingStrategy strategy) {
return items.stream()
.map(item -> strategy.apply(item.getPrice(), item.getQuantity()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
你再也不用到处 if 判断是否打折、是否批量优惠了,而是把策略从流程中"拿出来、注入进来"。
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!