【问题标题】:Mapping Map<String, List<>> with List<>映射 Map<String, List<>> 与 List<>
【发布时间】:2019-11-27 02:03:45
【问题描述】:

我需要一些帮助来映射 Map&lt;String, List&lt;Fee&gt;&gt;List&lt;FeeRequest&gt;

Fee 对象如下所示:

private String feeCode;

FeeRequest 对象如下所示:

private String feeCode;
private String debtorAccount;

所以我需要的是映射:

字符串 debtorAccount(来自地图) -> debtorAccount(来自列表)

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

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

我已经做到了:

Map&lt;String, List&lt;Fee&gt;&gt; feeAccounts 是从另一个方法中解析出来的。

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

我认为我的方法很糟糕,但我不知道如何让它发挥作用。我试着看一些例子,但它们太基础了。所以我很乐意得到任何帮助。谢谢!

【问题讨论】:

  • I think that my approach is bad - 为什么?
  • @Eran 因为我无法映射费用代码,它没有显示费用对象字段
  • 您可以使用feeAcc.getValue() 访问List&lt;Fee&gt;。不过,尚不清楚您希望用它做什么。
  • @Eran 基本上我想要的是FeeRequest.setFeeCode(Fee.getFeeCode())。一个列表映射中的费用代码与另一个列表中的费用代码
  • 但是输入 Map 的每个条目都包含一个 ListFee 实例。您希望使用其中的哪一个?还是要创建多个FeeRequest 实例(每个Fee 实例一个)?

标签: java list mapping


【解决方案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());

【讨论】:

  • 是的,因为您在第一步中获得了很多列表,然后必须将它们合并到一个地图中。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 2017-11-25
    • 2023-03-23
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多