使用java 8 Streams对项目列表进行分组,并使用FIRST Item而不是List填充生成的Map

时间:2017-09-21 10:49:05

标签: java java-8 java-stream

我有一个由以下类定义的项目:

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中有没有办法实现我想要的结果?

3 个答案:

答案 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相同。