Lambda|行为参数化 完整精讲

发布时间:2026/6/11 7:02:20

Lambda|行为参数化 完整精讲 一、核心一句话必背行为参数化把「可变的业务逻辑一段代码 / 行为当作参数传递进方法」同一个方法传入不同行为实现不同业务消除大量重复 if-else、重复方法避免重复造轮子。传统编码参数只能传数值、对象行为参数化代码逻辑也能当参数是 Lambda 核心思想。二、为什么需要行为参数化传统代码痛点场景筛选商品示例痛点需求 1筛选价格 100 的商品需求 2筛选分类 手机的商品需求 3筛选价格 50 并且分类 电脑传统写法缺点每多一个筛选规则新建一个筛选方法 → 方法泛滥、重复循环代码修改筛选条件就要改方法开闭原则差// 方案差一个条件一个方法 ListGoods filterByPrice(ListGoods list,Integer price){} ListGoods filterByCategory(ListGoods list,String category){}行为参数化解决方案只写 1 个通用 filter 方法筛选规则通过入参传入。三、演进路线从原始→匿名内部类→Lambda循序渐进理解步骤 1定义函数式接口承载行为函数式接口只有一个抽象方法的接口用来封装一段行为逻辑FunctionalInterface // 标记只能一个抽象方法 public interface GoodsPredicate { // 参数单个商品返回true/false 是否满足筛选条件 boolean test(Goods goods); }步骤 2编写通用过滤方法固定逻辑遍历集合变化逻辑判断规则→接口参数public static ListGoods filterGoods(ListGoods list, GoodsPredicate predicate){ ListGoods res new ArrayList(); for(Goods g : list){ // 调用传入的行为逻辑 if(predicate.test(g)){ res.add(g); } } return res; }固定逻辑循环遍历封装一次变化逻辑外部传入这就是行为参数化精髓步骤 3三代调用写法对比第一代自定义实现类笨重新增规则新建类class PriceOver100 implements GoodsPredicate{ Override public boolean test(Goods g) {return g.getPrice()100;} } //调用 filterGoods(list,new PriceOver100());第二代匿名内部类省去实体类但代码冗余filterGoods(list, new GoodsPredicate() { Override public boolean test(Goods g) { return 手机.equals(g.getCategory()); } });第三代Lambda 表达式行为参数化最终形态极简// 筛选价格100 filterGoods(list,g-g.getPrice()100); // 筛选分类电脑 filterGoods(list,g-电脑.equals(g.getCategory()));✅直接把判断逻辑行为作为第二个参数传入不用新建类、不用匿名类四、核心三大关键点理解必背函数式接口是载体承载要传递的行为FunctionalInterface注解约束行为作为入参方法形参定义为接口类型调用时传入 Lambda具体实现逻辑固定逻辑抽进方法变化逻辑外部传入一套方法适配 N 种业务五、项目中四大落地运用场景高频实战场景 1集合筛选、排序、遍历Stream 全套底层都是行为参数化ListGoods goodsList; // 筛选 ListGoods phones goodsList.stream().filter(g-手机.equals(g.getCategory())).collect(Collectors.toList()); // 排序排序规则作为参数 goodsList.sort((g1,g2)-g1.getPrice().compareTo(g2.getPrice())); // 遍历消费行为传入 goodsList.forEach(g- System.out.println(g.getName()));filter 参数Predicate、sort 参数Comparator、forEach 参数Consumer全是 JDK 内置函数式接口。场景 2自定义统一工具类通用校验、统一处理器比如统一 Excel 导入固定逻辑读取文件、捕获异常变化逻辑每行数据保存逻辑通过 Lambda 传入//通用导入模板 public static T void importExcel(File file, ConsumerT saveFunc){ //固定解析excel ListT data parseExcel(file); for(T item:data){ saveFunc.accept(item); //外部传入保存逻辑 } } //使用传入不同保存逻辑 importExcel(file,user-userService.save(user)); importExcel(file,order-orderService.save(order));场景 3策略逻辑替换大量 if else替代策略模式手写类比如优惠计算统一结算方法优惠策略通过 Lambda 传入FunctionalInterface interface Discount{ BigDecimal calc(BigDecimal money); } BigDecimal settle(BigDecimal money,Discount discount){ return discount.calc(money); } //满减 settle(new BigDecimal(200),m-m.compareTo(new BigDecimal(100))0?m.subtract(new BigDecimal(20)):m); //折扣 settle(new BigDecimal(200),m-m.multiply(new BigDecimal(0.8)));场景 4线程任务、异步回调Thread(Runnable)Runnable 是函数式接口任务行为通过 Lambda 传入new Thread(()- System.out.println(执行任务)).start();六、JDK 四大内置核心函数式接口背诵日常 90% 场景够用表格接口抽象方法用途PredicateTboolean test(T t)判断筛选filter、条件校验ConsumerTvoid accept(T t)消费处理forEach、数据保存FunctionT,RR apply(T t)类型转换mapT 转 RSupplierTT get()对象供给创建对象、延迟获取数据示例快速使用//Function字符串转Integer FunctionString,Integer func s-Integer.parseInt(s); Integer num func.apply(123);七、行为参数化优点面试简答代码复用固定逻辑只写一次减少重复代码不重复造轮子扩展性极强新增业务规则不用新增方法 / 实体类直接传 Lambda消除臃肿 if-else、过多实体类代码简洁配合 Stream简化集合操作八、易混点总结Lambda 本质函数式接口的实例是行为参数化的语法糖行为参数化本质把可变算法抽离为入参面向接口、开闭原则落地没有函数式接口就无法实现行为参数化。九、背诵口诀行为参数化逻辑当参数函数接口做载体Lambda 传行为固定代码写内部变化规则外部给筛选排序和回调四大接口全搞定。

相关新闻