java 8 альтернатива для вложенных циклов - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть следующий фрагмент, и мне интересно, можно ли заменить его на Java -streams / Java 8 API

List<Borrower> borrowers = creditcomplex.getBorrowers();
for (Borrower borrower : borrowers) {
    List<Facility> facilities = borrower.getFaciliies();
    for (Facility facility : facilities) {
        List<RepaymentSchedule> repaymentScheduleList = facility.getrepaymentSchedule();
        if (repaymentScheduleList != null) {
            for (RepaymentSchedule repaymentschedule : repaymentScheduleList) {
                double[] repayment = 
                    amortizationService.calculateAmortizationSchedule(repaymentschedule);
                double[] drawdown = 
                    amortizationService.calculateRepaymentSchedule(repaymentschedule);
                double[] outstandingProfie = amortizationService
                        .calculateOutstandingSchedule(repaymentschedule);
            }
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 06 февраля 2020

Вы можете использовать flatMap:

creditcomplex.getBorrowers().stream()
    .flatMap(b -> b.getFaciliies().stream())
    .flatMap(f -> Optional.ofNullable(f.getrepaymentSchedule()).stream())
    .forEach(repaymentschedule -> {
            double[] repayment = 
                amortizationService.calculateAmortizationSchedule(repaymentschedule);
            double[] drawdown = 
                amortizationService.calculateRepaymentSchedule(repaymentschedule);
            double[] outstandingProfie = amortizationService
                    .calculateOutstandingSchedule(repaymentschedule);
    });

PS1: обратите внимание, что Optional#stream появилось в java 9, вам может понадобиться:

optional.map(Stream::of).orElseGet(Stream::empty)

Это занято с здесь .

PS2: То, что вы делаете в forEach, не имеет никакого эффекта (вы объявляете и инициализируете массивы внутри, но вы не можете использовать их вне l oop. Я оставил код, потому что он может быть заменен любым вычислением для вложенных элементов.

PS3: возвращение null вместо пустого списка подвержено ошибкам, и обычно лучше go с пустой список.

1 голос
/ 06 февраля 2020

Не проверено, но оно должно быть примерно

List<RepaymentSchedule> repaymentSchedules = creditcomplex.getBorrowers().stream()
    .flatMap(borrower -> borrower.getFacilities().stream())
    .map(facility -> facility.getrepaymentSchedule())
    .filter(repaymentScheduleList -> repaymentScheduleList != null)
    .flatMap(repaymentScheduleList -> repaymentScheduleList.stream())
    .collect(Collectors.toList());

- это одно, и отсюда вы можете создать массивы.

В качестве альтернативы, вы можете опустить .collect() и вместо этого сделать

.forEach(repaymentSchedule -> {
    double[] repayment = 
                amortizationService.calculateAmortizationSchedule(repaymentschedule);
    double[] drawdown = 
                amortizationService.calculateRepaymentSchedule(repaymentschedule);
    double[] outstandingProfie = amortizationService
                    .calculateOutstandingSchedule(repaymentschedule);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...