Function + Stream 还可以这样玩?

点击上方"程序员蜗牛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实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

相关推荐
考虑考虑4 小时前
数据库中的EXISTS
运维·数据库·后端
郑州光合科技余经理5 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼5 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
苏三说技术10 小时前
为什么越来越多人用OpenWiki?
后端
IT_陈寒10 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
Bs_MoneyMagnet10 小时前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计
码事漫谈10 小时前
FDE 的起源、形态与真实边界
后端
ServBay11 小时前
Grok Bot 还是 OpenClaw?聊聊真正能替人打杂的 AI 智能体
后端·aigc·grok
掘金挖土11 小时前
前端手摸手跑路之 AI 应用开发(五)
前端·后端
弈栈录11 小时前
LangGraph 入门:用状态机设计可靠的 Agent 工作流
后端·程序员