简体   繁体   English

如何减少 Java 8 中的重复代码?

[英]How can i reduce this repeat code in Java 8?

I have the following code that keeps repeating a lot.我有以下代码不断重复。 Maybe there is a way to reduce it but i dont know too much of java.也许有办法减少它,但我不太了解 java。 It looks like this:它看起来像这样:

public Optional<byte[]> generateReportA(List<ClassThatChange> request){
        if(CollectionUtils.isEmpty(request)) {
           return Optional.empty();
        }
        
        List<ClassThatNOChange> list = new ArrayList<>();

        
        for(ClassThatChange item : request){
            ClassThatNOChange c = new ClassThatNOChange()
            
            //here is the line of code that changes from report to report
            c.setResult(callMethodA(item.getVariable1(), item.getVariable2()));

            list.add(c);
        }
        
        return Optional.of(callSameMethod(list));
}

public Optional<byte[]> generateReportB(List<ClassThatChange> request){
        if(CollectionUtils.isEmpty(request)) {
           return Optional.empty();
        }
        
        List<ClassThatNOChange> list = new ArrayList<>();

        
        for(ClassThatChange item : request){
            ClassThatNOChange c = new ClassThatNOChange()
            
            //here is the line of code that changes from report to report
            c.setResult(callMethodB(item.getVariable2()));

            list.add(c);
        }
        
        return Optional.of(callSameMethod(list));
}

The only thing that change is the callMethodA, or B, or C... but all of them return the same type of answer.唯一改变的是 callMethodA 或 B 或 C ......但它们都返回相同类型的答案。

The ClassThatChange is something like this: ClassThatChange 是这样的:

public class Father{
      private Date date;
      // then the getters and setters
}

public class Son extends Father{
      private String description;
      // then the getters and setters
}

All the classes that can change extends from the father.所有可以改变的类都继承自父类。

Is there a way to reduce this repeat code?有没有办法减少这个重复代码? Sorry for my bad English.对不起,我的英语不好。

I think what you are looking for is a way to plug in a conversion from the type that changes in each case to the type that is always the same.我认为您正在寻找的是一种插入从在每种情况下更改的类型到始终相同的类型的转换的方法。 That could be done with a Function , or with a customized functional interface that you define.这可以通过Function或您定义的自定义功能接口来完成。 Here, I'm showing Function .在这里,我展示的是Function

private <T> Optional<byte[]> convert(
    List<? extends T> request, 
    Function<? super T, ? extends SomeTypeYouDidNotShow> conversion) {

    if (request.isEmpty()) return Optional.empty();
    List<ClassThatNOChange> list = request.stream()
        .map(item -> {
                ClassThatNOChange c = new ClassThatNOChange();
                c.setResult(conversion.apply(item));
                return c;
            })
        .collect(Collectors.toList());
    return Optional.of(callSameMethod(list));
}

Then all your duplicate methods would look something like this:然后你所有的重复方法看起来像这样:

public Optional<byte[]> generateReportA(List<Father> request) {
    return convert(request, 
        item -> callMethodA(item.getVariable1(), item.getVariable2()));
}

public Optional<byte[]> generateReportB(List<Son> request) {
    return convert(request, 
        item -> callMethodB(item.getVariable2()));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM