首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Collectors.toMap如何转换映射值

使用Collectors.toMap如何转换映射值
EN

Stack Overflow用户
提问于 2020-01-17 11:42:34
回答 3查看 5.5K关注 0票数 2

我有一个Map<String, List<StartingMaterial>>,我想将列表中的对象转换为另一个对象。即。Map<String, List<StartingMaterialResponse>>

我可以使用java流Collectors.toMap()来完成这个任务吗?

我尝试了下面的代码。

代码语言:javascript
复制
Map<String, List<StartingMaterial>>  startingMaterialMap = xxxx;

startingMaterialMap.entrySet().stream().collect(Collectors.toMap( Map.Entry::getKey, Function.identity(), (k, v) -> convertStartingMaterialToDto(v.getValue())));

更改对象的转换代码如下所示,

代码语言:javascript
复制
private StartingMaterialResponse convertStartingMaterialToDto(StartingMaterial sm) {

    final StartingMaterialMatrix smm = sm.getStartingMaterialMatrix();
    final StartingMaterial blending1Matrix = smm.getBlending1Matrix();
    final StartingMaterial blending2Matrix = smm.getBlending2Matrix();

    return new StartingMaterialResponse(
            sm.getId(),
            sm.getComponent().getCasNumber(),
            sm.getDescription(),
            sm.getPriority(),
            String.join(" : ",
                    Arrays.asList(smm.getCarryInMatrix().getComponent().getMolecularFormula(),
                            blending1Matrix != null ? blending1Matrix.getComponent().getMolecularFormula() : "",
                            blending2Matrix != null ? blending2Matrix.getComponent().getMolecularFormula() : ""
                    ).stream().distinct().filter(m -> !m.equals("")).collect(Collectors.toList())),
            smm.getFamily(),
            smm.getSplitGroup());
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-17 11:47:53

您可以使用toMap收集器,因为您的源是一个映射。但是,您必须遍历所有的值,并将每个值转换为valueMapper中的DTO格式。

代码语言:javascript
复制
Map<String, List<StartingMaterialResponse>> result = startingMaterialMap.entrySet().stream()
    .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().stream()
        .map(s -> convertStartingMaterialToDto(s)).collect(Collectors.toList())));
票数 2
EN

Stack Overflow用户

发布于 2020-01-17 11:48:36

我想你的意思是:

代码语言:javascript
复制
startingMaterialMap.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey,
                e -> e.getValue().stream()
                        .map(this::convertStartingMaterialToDto)
                        .collect(Collectors.toList()))
        );
票数 1
EN

Stack Overflow用户

发布于 2020-01-17 11:52:02

下面是我处理这个问题的方法:

代码语言:javascript
复制
    Map<String, List<Integer>> deposits = new HashMap<>();

    deposits.put("first", Arrays.asList(1, 2, 3));

    deposits.forEach((depositName, products) -> {
        products.stream()
                .map(myIntegerProduct -> myIntegerProduct.toString())
                .collect(Collectors.toList());
    });

上面的示例将List<Integer>转换为字符串列表。在您的示例中,convertStartingMaterialToDto方法代替了convertStartingMaterialToDto方法。

forEach方法遍历映射中的每个键值对,并且为键和值参数设置一些名称,使其更具体,并为读取它的每个人保留一个可以理解的代码。在我的示例中:forEach( (depositName, products)) -> depositName是键(在我的例子中是字符串),products是键的值(在我的例子中是整数列表)。

最后,您也将遍历列表,并将每一项map为新类型。

products.stream() .map(myIntegerProduct -> myIntegerProduct.toString())

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59786684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档