如何解决如何使用Java流将LIst <Object>转换为Map <K,V>
我想将List<ObjectInList>
转换为Map<K,V>
class ObjectInList {
List<Long> listWithLong;
Map<String,Object> dataMap; // there is 'id' key,and i want to use this id as key in map to be converted
}
新的地图格式如下
String type; // this type is value of dataMap.
List<Long> contents
List<Object>
中的每个对象可以具有重复的类型
例如
///////// before converted ////////////
[
{
list: [1,2,3],dataMap: {
type: "a",}
},{
list: [4,5,6],dataMap: {
type: "b",{
list: [7,8],]
///////////// after converted //////////
{
"a": [1,3,7,"b": [4,6]
}
解决方法
您可以使用groupingBy
来对type
进行分组,并使用flatMapping
来平整Long
数据列表并作为单个列表进行收集。
Map<String,List<Long>> res =
objectInList
.stream()
.collect(Collectors.groupingBy(
e -> e.getDataMap().get("type"),Collectors.flatMapping(
e -> e.getListWithLong().stream(),Collectors.toList())
));
,
我不确定为什么Map<String,Object> dataMap;
应该只具有一个值时为什么需要它。为简单起见,我将您的ObjectInList
类修改为
class ObjectInList {
List<Long> listWithLong;
String type;
}
要获取分组列表,我们可以-
Map<String,List<Long>> grouped =
objectInLists.stream()
.collect(
Collectors.toMap(
ObjectInList::getType,ObjectInList::getListWithLong,(oldList,newList) -> {
oldList.addAll(newList);
return oldList;
}));
说明:
toMap
方法-
public static <T,K,U>
Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper,Function<? super T,? extends U> valueMapper,BinaryOperator<U> mergeFunction)
toMap
取keyMapper
,ObjectInList::getType
(根据类型分组),valueMaper为ObjectInList::getListWithLong
,由于我们有重复的密钥,我们需要提供一个{{1 }}为mergeFunction
摘自文档-
合并功能,用于解决关联值之间的冲突 使用与提供给{@link Map#merge(Object,Object, BiFunction)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。