繁体   English   中英

如何转换列表<Class A>到地图<String, List<Class B> &gt;

[英]How to convert List<Class A> to Map<String, List<Class B>>

我有一些场景必须将对象从List<Class A>转换为Map<String, List<Class B>> 我尝试尝试的是按 A 类中的一个字段对信息进行分组,并从 A 类中删除无用字段(导致 B 类)

目前,我可以通过下面的示例代码来做到这一点。

// Raw data input
List<TestClass> itemList = new ArrayList<>();
    // Add items here...

// group by field
Map<String, List<TestClass>> result = itemList.stream()
             .collect(Collectors.groupingBy(TestClass::getUsername));

// Reform every single list and add to a new Map
Map<String, List<TestClassShort>> tcsMap = new HashMap<>();

for (Map.Entry<String, List<TestClass>> tc: result.entrySet()) {
    tcsMap.put(tc.getKey(), 
               tc.getValue().stream()
               .map(x -> new TestClassShort(x.getGroupId(), x.getGroupName()))
               .collect(Collectors.toList()));
}

是否可以在不创建额外 HashMap 的情况下实现目标?

您可以使用groupingBy提供下游收集器。

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;

// declare for readability, I found it ugly inline
Function<TestClass, TestClassShort> shorten = 
             x -> new TestClassShort(x.getGroupId(), x.getGroupName());

Map<String, List<TestClassShort>> result = itemList.stream()
            .collect(groupingBy(TestClass::getUsername,mapping(shorten, toList())));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM