将对象列表转换为 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.groupingByCollectors.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())));