我有一个由以下类定义的项目:
public class Item {
private int id;
private float price;
}
我收到了一个项目列表,我需要按 id 对它们进行分组。一旦分组,我知道List只会为每个id包含一个值,所以我希望生成的Map定义如下:
Map<Integer, Item>
而不是:
Map<Integer, List<Item>>
这样做的好处是我的调用代码不需要执行额外的解除引用:
mapName.get(ID)的获得(0)
以下代码将按ID对项目进行分组,并创建包含列表的地图:
Map<Integer, List<Item>> itemsMap = itemList.stream()
.collect(Collectors.groupingBy(Item::getId));
Java 8中有没有办法实现我想要的结果?
答案 0 :(得分:2)
itemList.stream()
.collect(Collectors.toMap(item -> item.id, item -> item));
答案 1 :(得分:2)
您可以使用:
Map<Integer, Item> itemsMap = items.stream().collect(Collectors.toMap(Item::getId, Function.<Item>identity()));
答案 2 :(得分:1)
使用诸如intelliJ之类的IDE进行此类转换的一种方法是:
List<Item> itemList = ...
Map<Integer, Item> itemMap = new HashMap<>();
for (Item item : itemList) {
itemMap.put(item.getId(), item);
}
然后将语句转换/替换为:
Map<Integer, Item> itemMap =
itemList.stream().collect(Collectors.toMap(Item::getId, item -> item, (a, b) -> b));
与John's answer相同。