Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
干净的代码-压缩Java代码的最佳方法_Java_Code Cleanup - Fatal编程技术网

干净的代码-压缩Java代码的最佳方法

干净的代码-压缩Java代码的最佳方法,java,code-cleanup,Java,Code Cleanup,我有如下代码: for(int i=0; i < a; i++){ List<Integer> list = elementA.get(i); SomeClass rg = new SomeClass(list, a, methodA(i)); int result = rg.generate(); var+=methodA2(i, result); } for(int i=0; i <

我有如下代码:

    for(int i=0; i < a; i++){
        List<Integer> list = elementA.get(i);
        SomeClass rg = new SomeClass(list, a, methodA(i));
        int result = rg.generate();
        var+=methodA2(i, result);
    }
    for(int i=0; i < b; i++){
        List<Integer> list = elementB.get(i);
        SomeClass rg = new SomeClass(list, b, methodB(i));
        int result = rg.generate();
        var+=methodB2(i, result);
    }
for(int i=0;i

如何避免这种代码重复?我可以创建这样做的函数,但是如何使用不同的方法呢

使用Java<8,您可以创建一个接口(注意Java 8中已经有一个
IntFunction
接口):

  • 定义一个方法,该方法将
    列表
    作为返回所需数据的参数接收
  • 定义一个包含通用方法的接口,如
    method
    method2
    (基于您的代码)
例如:

public long yourFooMethod(List<List<Integer>> listOfData, int n, SomeInterface foo) {
    int i = 0;
    long var = 0;
    for(List<Integer> list : listOfData) {
        SomeClass rg = new SomeClass(list, n, foo.method(i));
        int result = rg.generate();
        var += foo.method2(i, result);
    }
    return var;
}
public long yourfoo方法(列表数据、int n、SomeInterface foo){
int i=0;
长var=0;
对于(列表:listOfData){
SomeClass rg=新的SomeClass(list,n,foo.method(i));
int result=rg.generate();
var+=foo.method2(i,结果);
}
收益var;
}

它取决于elementA和elementB、methodA()和methodB()以及methodA2()和methodB2()的声明。如果类的get()方法是由公共接口或超类定义的,这会有所帮助。至于方法,我们只需要对它们有更多的了解——它们是否以某种方式与get()对应@ᴋᴇʏsᴇʀ我添加了一个更详细的示例。可能值得指出的是,
IntFunction
接口。@Boristeider是的,我确实是故意选择了这个名称!我知道,我想你是这样做的——也许值得明确地说出来。
private void m(Collection<List<Integer>> element, int a, IntFunction<A> f) {
    for(int i=0; i < a; i++){
        List<Integer> list = element.get(i);
        SomeClass rg = new SomeClass(list, a, f.apply(i));
        int result = rg.generate();
    }
}
m(elementA, a, i -> methodA(i));
//or
m(elementA, a, this::methodA);
public long yourFooMethod(List<List<Integer>> listOfData, int n, SomeInterface foo) {
    int i = 0;
    long var = 0;
    for(List<Integer> list : listOfData) {
        SomeClass rg = new SomeClass(list, n, foo.method(i));
        int result = rg.generate();
        var += foo.method2(i, result);
    }
    return var;
}