如何减少Java中多操作符迭代列表至稳定状态的代码重复?
减少Java代码重复的优化方案
问题描述
我正尝试减少Java代码中的重复代码,本人并非Java专家,可能遗漏了基础知识点。目标是通过多个操作符foo1, foo2, ..., fooN对列表进行操作。每个操作需迭代执行直到列表达到稳定状态(操作不再改变列表),每个操作包含一次正向遍历和一次反向遍历,仅需反转列表即可实现反向遍历,且每次遍历也需迭代至列表稳定。由于操作符需按顺序执行,导致大量代码重复。
当前实现的伪Java代码如下(注意:foo操作会尝试修改列表arg1,仅当arg1被修改时返回true):
reduceByFoo1(arg1,arg2,arg3){ doUpdate = true; while(doUpdate) { doUpdate = false; doPass = true; while(doPass) { doPass = foo1(arg1,arg2,arg3); doUpdate |= doPass; } Collections.reverse(arg1); doPass = true; while(doPass) { doPass = foo1(arg1,arg2,arg3); doUpdate |= doPass; } Collections.reverse(arg1); } } reduceByFoo2(arg1,arg2,arg3){ ...same code as above, but with foo2.. } reduceByFoo3(arg1,arg2,arg3){ ...same code as above, but with foo3.. } ...and so on...
请问有什么好方法可以减少代码重复或改进设计模式?
优化后的实现
采用方案后,优化后的代码如下:
interface Foo {boolean bar(List arg1, Object arg2, Object arg3);} boolean fooUntilStable(Foo foo, List arg1, Object arg2, Object arg3) { boolean iterate = true; boolean updated = false; while(iterate) { iterate = foo.bar(arg1, arg2, arg3); updated |= iterate; } return updated; } void biFooUntilStable(Foo foo, List arg1, Object arg2, Object arg3){ Foo biFoo = (a1, a2, a3) -> { boolean updated = fooUntilStable(foo, a1, a2, a3); Collections.reverse(a1); updated |= fooUntilStable(foo, a1, a2, a3); Collections.reverse(a1); return updated; }; fooUntilStable(biFoo,arg1,arg2,arg3); } // 定义各个操作符 Foo foo1 = (arg1,arg2,arg3) -> {...}; Foo foo2 = (arg1,arg2,arg3) -> {...}; ... Foo fooN = (arg1,arg2,arg3) -> {...}; // 执行操作 biFooUntilStable(foo1,arg1,arg2,arg3); biFooUntilStable(foo2,arg1,arg2,arg3); ... biFooUntilStable(fooN,arg1,arg2,arg3);
优化思路
- 定义
Foo函数式接口,统一所有操作符的方法签名,让不同的foo操作可以作为参数传递 - 提取
fooUntilStable方法,封装「单次遍历直到列表稳定」的逻辑,复用遍历迭代的代码 - 提取
biFooUntilStable方法,封装「正向遍历+反转列表+反向遍历+反转回原顺序」的完整操作逻辑,内部复用fooUntilStable实现稳定判断 - 最后只需定义各个
Foo的Lambda实现,调用biFooUntilStable即可完成对应操作,彻底消除重复代码
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

