Вернуть карту карты без побочных эффектов, используя Java 8 Stream - PullRequest
0 голосов
/ 07 февраля 2019

Как мне добавить / добавить eServiceReportsMapByBatchFile с ключом oldReportId в eServiceReportMap без побочных эффектов?

Map<String, Map<String, Set<EServiceReport>>> eServiceReportMap = new HashMap<>();
reports.forEach(report -> {
    String oldReportId = report.getOldId();
        Map<String, Set<EServiceReport>> eServiceReportsMapByBatchFile = // processing of batch files
        ...
    eServiceReportMap.put(oldReportId, eServiceReportsMapByBatchFile);
});

return eServiceReportMap;

То есть я хочу, чтобы оно стало таким:

return reports.stream()
    .map(report -> {
        String oldReportId = report.getOldId();
        Map<String, Set<EServiceReport>> eServiceReportsMapByBatchFile = // processing of batch files
        ...
        // I don't know how and what to return here
    }).collect(// I don't know what to do here);

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

, так как вы звоните stream на reports, я предполагаю, что это какая-то коллекция;в таком случае нет ничего плохого в ваших побочных эффектах.Обратите внимание, что someCollection.stream().forEach и someCollection.forEach - это очень разные вещи, вы более чем нормально иметь побочные эффекты с SomeCollection::forEach - который является не чем иным, как простым старым циклом внутри.

Вы могли бы преобразуйте это в потоковое решение, но оно будет намного менее читабельным:

reports.stream()
       .map(r -> {
            String oldReportId = report.getOldId();
            Map<String, Set<EServiceReport>> eServiceReportsMapByBatchFile =....  
            return new SimpleEntry<>(oldReportId, eServiceReportsMapByBatchFile);
       })
       .collect(Collectors.toMap(
            Entry::getKey,
            Entry::getValue,
            (left, right) -> right; // to match whatever you had until now
       ))
0 голосов
/ 07 февраля 2019

Вы ожидаете в основном Collectors.toMap, который можно использовать как:

return reports.stream()
        .collect(Collectors.toMap(report -> report.getOldId(),
                        report -> {
                    // batch processing for eServiceReportsMapByBatchFile
                            return eServiceReportsMapByBatchFile;
                }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...