Как я могу уменьшить этот повторяющийся код до Java 8? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть следующий код, который постоянно повторяется. Возможно, есть способ уменьшить его, но я не слишком много знаю о java. Это выглядит так:

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));
}

Единственное, что изменяется, - это callMethodA, или B, или C ... но все они возвращают один и тот же тип ответа.

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
}

Все классы, которые могут изменяться, наследуются от отца.

Есть ли способ уменьшить этот повторяющийся код? Извините за мой плохой англи sh.

1 Ответ

2 голосов
/ 04 августа 2020

Я думаю, что вы ищете способ подключить преобразование из типа, который меняется в каждом случае, в тип, который всегда один и тот же. Это можно сделать с помощью 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));
}

Тогда все ваши повторяющиеся методы будут выглядеть примерно так:

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()));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...