将Map <String,List <>>与List <>映射

时间:2019-07-18 07:37:54

标签: java list mapping

我需要一些帮助来将Map<String, List<Fee>>List<FeeRequest>映射。

Fee对象如下:

private String feeCode;

FeeRequest对象看起来像这样:

private String feeCode;
private String debtorAccount;

所以我需要映射:

字符串债务人帐户(来自地图) -> debtorAccount(来自列表)

feeCode(来自地图列表) -> feeCode(来自列表列表)

我想尝试使用foreach,而是学会正确使用.stream().map()功能。

我设法做到的事情:

Map<String, List<Fee>> feeAccounts是从另一种方法解析的。

 List<FeeRequest> feeRequests = feeAccounts.entrySet().stream().map(feeAcc -> {
        FeeRequest request = new FeeRequest();
        request.setDebtorAccount(feeAcc.getKey());
        request.setFeeCode(...);
        return request;
    }).collect(Collectors.toList());

我认为我的方法不好,但是我不知道如何使它起作用。我试着看一些例子,但是它们太基础了。因此,我很乐意得到任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

如果每个Fee实例都应生成一个FeeRequest实例,则需要flatMap

List<FeeRequest> feeRequests =
    feeAccounts.entrySet()
               .stream()
               .flatMap(feeAcc -> feeAcc.getValue()
                                        .stream()
                                        .map(f -> {
                                            FeeRequest request = new FeeRequest();
                                            request.setDebtorAccount(feeAcc.getKey());
                                            request.setFeeCode(f.getCode());
                                            return request;
                                        }))
               .collect(Collectors.toList());

答案 1 :(得分:0)

如果FeeRequest的构造函数带有两个参数,则可以使用类似以下的内容:

feeAccounts.entrySet().stream()
        .flatMap(
                accountEntry -> accountEntry.getValue().stream().map(
                        fee -> new FeeRequest(
                                accountEntry.getKey(),
                                fee.getFeeCode()
                        )
                )
        ).collect(toList());