[英]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.