You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何减少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:42:47