将对象列表转换为 java 中的地图
Transform List of object to a Map in java
我有一个项目列表 List<Item> resultBl
,如下所示:
id = 18003 amount = 128 nameType = SUBMITTED
id = 18189 amount = 95 nameType = SUBMITTED
id = 18192 amount = 160 nameType = POSITIVE
id = 18192 amount = 30 nameType = DRAFT
id = 18192 amount = 873 nameType = SUBMITTED
id = 18237 amount = 390 nameType = POSITIVE
id = 18237 amount = 60 nameType = DRAFT
id = 18237 amount = 2731 nameType = SUBMITTED
我想用这种形式将此列表转换为 map
,键是 id
,值是 list
个对象:
Map<Integer,List<ItemDetails>> mapTest= new HashMap<Integer,List<ItemDetails>>();
[18237 , [amount = 390 ,nameType = POSITIVE],[amount = 60 nameType = DRAFT], [amount = 2731 nameType = SUBMITTED]], ...
我尝试了不同的方法,但总是有重复的元素:
List<Integer> ids2 = new ArrayList<Integer>();
List<Integer> ids = new ArrayList<Integer>();
for(Item item: resultBl) {
ids.add(item.getId());
}
ids2 =ids.stream().distinct().collect(Collectors.toList());
Map<Integer,List<ItemDetails>> mapTest= new HashMap<Integer,List<ItemDetails>>();
List<ItemDetails> itemDetailsList = new ArrayList<ItemDetails>();
for(Integer s:ids2) {
for(Item i : resultBl) {
if(s.equals(i.getId())) {
ItemDetails it =new ItemDetails();
it.setAmount(i.getAmount());
it.setNameType(i.getNameType()) ;
itemDetailsList .add(it);
}
}
mapTest.put(s, itemDetailsList);
}
我会使用流和 groupingBy
来做到这一点。
当您有了物品清单后resultBl
您所要做的就是
Map<Integer, List<Item>> resultMap = resultBl.stream().collect(groupingBy(Item::getId, toList()));
进口:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
这将按 id
参数对您的项目进行分组。
Map<Integer,List<Item>> map = resultBL.stream(Collectors.toMap(Item::getId, Function.identity()));
是拉姆达。 Java 版本 >= 8
Collectors.groupingBy
和 Collectors.mapping
对于 downstream
应该有效:
Map<Integer, List<ItemDetails>> result = resultBl.stream().collect(Collectors.groupingBy(Item::getId, Collectors.mapping(ItemDetails::new, Collectors.toList())));
您最好的选择是向 ItemDetails
添加构造函数以接受 Item
对象:
public class ItemDetails {
// properties, getters and setters
public ItemDetails(Item item) {
this.amount = item.getAmount();
this.nameType = item.getNameType();
}
}
然后使用下面的Java8个特征:
Map<Integer, List<ItemDetails>> itemsPerId =
itemsList.stream().collect(Collectors.groupingBy(Item::getId, Collectors.mapping(ItemDetails::new, Collectors.toList())));
我有一个项目列表 List<Item> resultBl
,如下所示:
id = 18003 amount = 128 nameType = SUBMITTED
id = 18189 amount = 95 nameType = SUBMITTED
id = 18192 amount = 160 nameType = POSITIVE
id = 18192 amount = 30 nameType = DRAFT
id = 18192 amount = 873 nameType = SUBMITTED
id = 18237 amount = 390 nameType = POSITIVE
id = 18237 amount = 60 nameType = DRAFT
id = 18237 amount = 2731 nameType = SUBMITTED
我想用这种形式将此列表转换为 map
,键是 id
,值是 list
个对象:
Map<Integer,List<ItemDetails>> mapTest= new HashMap<Integer,List<ItemDetails>>();
[18237 , [amount = 390 ,nameType = POSITIVE],[amount = 60 nameType = DRAFT], [amount = 2731 nameType = SUBMITTED]], ...
我尝试了不同的方法,但总是有重复的元素:
List<Integer> ids2 = new ArrayList<Integer>();
List<Integer> ids = new ArrayList<Integer>();
for(Item item: resultBl) {
ids.add(item.getId());
}
ids2 =ids.stream().distinct().collect(Collectors.toList());
Map<Integer,List<ItemDetails>> mapTest= new HashMap<Integer,List<ItemDetails>>();
List<ItemDetails> itemDetailsList = new ArrayList<ItemDetails>();
for(Integer s:ids2) {
for(Item i : resultBl) {
if(s.equals(i.getId())) {
ItemDetails it =new ItemDetails();
it.setAmount(i.getAmount());
it.setNameType(i.getNameType()) ;
itemDetailsList .add(it);
}
}
mapTest.put(s, itemDetailsList);
}
我会使用流和 groupingBy
来做到这一点。
当您有了物品清单后resultBl
您所要做的就是
Map<Integer, List<Item>> resultMap = resultBl.stream().collect(groupingBy(Item::getId, toList()));
进口:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
这将按 id
参数对您的项目进行分组。
Map<Integer,List<Item>> map = resultBL.stream(Collectors.toMap(Item::getId, Function.identity()));
是拉姆达。 Java 版本 >= 8
Collectors.groupingBy
和 Collectors.mapping
对于 downstream
应该有效:
Map<Integer, List<ItemDetails>> result = resultBl.stream().collect(Collectors.groupingBy(Item::getId, Collectors.mapping(ItemDetails::new, Collectors.toList())));
您最好的选择是向 ItemDetails
添加构造函数以接受 Item
对象:
public class ItemDetails {
// properties, getters and setters
public ItemDetails(Item item) {
this.amount = item.getAmount();
this.nameType = item.getNameType();
}
}
然后使用下面的Java8个特征:
Map<Integer, List<ItemDetails>> itemsPerId =
itemsList.stream().collect(Collectors.groupingBy(Item::getId, Collectors.mapping(ItemDetails::new, Collectors.toList())));