如何理解jdk8通过行为参数化传递代码
行为参数化可以帮助你处理频繁变更需求的一种软件开发模式。
public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p){
List<Apple> result =new ArrayList<>();
for(Apple apple:inventory){
if(p.test(apple)){
result.add(apple);
}
}
return restlt;
}
ApplePredicate是一个接口,定义了一个test方法,如果你有很多不同的需求,比如:筛选出红颜色的苹果的数量,筛选出重量大于150g的苹果数量等等
可以写多个实现类,重新test方法,实现不同的功能。这个p就是不同实例对象,一般这样 new ApplePredicateImpl1()写
filterApples方法的行为取决于你通过ApplePredicate对象传递代码,也就是说,filterApples方法的行为参数化了
我觉得行为参数化,其实类似于集成的方式,把你定义好的接口,实现类作为参数传到你需要处理的方法中,进行操作。
这种方式可以降低代码的耦合度,又能应对复杂多变的需求。
代码优化1:使用匿名类
匿名类:没有名字的一个类,允许同时声明和实例化一个类(允许你随用随建)
List<Apple> list=filterApples(List<Apple> inventory,new ApplePredicate(){
public boolean test(Apple apple){
return "red".equals(apple.getColor());
}
}
);
缺点:代码笨重,占用了很多空间
代码优化2:使用Lambda表达式简化代码
List<Apple> list=filterApples(List<Apple> inventory,(Apple apple)-> "red".equals(apple.getColor()));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY