【问题标题】:Java 8 extracting/coverting List<Object> into Map<String, List<String>> using stream()Java 8 使用 stream() 将 List<Object> 提取/转换为 Map<String, List<String>>
【发布时间】:2014-07-18 09:19:11
【问题描述】:

试图弄清楚如何在我的代码中有效地使用新的 Java 8 功能 .stream()。

这是我的一般代码

List<Item> list = db.query(sqlStatement, (rs, i) -> new Item(rs));

    Map<String, List<Item>> itemsByName = new HashMap<>();

    for (Item m : list) {
        if (!itemsByName.containsKey(m.getName())) {

            ArrayList<Item> items = new ArrayList<>();
                            items.add(m);

            itemsByName.put(m.getName(), items);
        } else {
            itemsByName.get(m.getName()).add(m);
        }
    }

由此(1)

List<Item> list = db.query(sqlStatement, (rs, i) -> new Item(rs));

我得到的项目列表如下:

列表(0):名称1:值1

列表(1):名称1:值2

列表(2):名称2:值1

list(3): Name3:Value3

由此(2)

Map<String, List<Item>> itemsByName = new HashMap<>();

    for (Item m : list) {
        if (!itemsByName.containsKey(m.getName())) {

            ArrayList<Item> items = new ArrayList<>();
                            items.add(m);

            itemsByName.put(m.getName(), items);
        } else {
            itemsByName.get(m.getName()).add(m);
        }
    }

我想得到:

MapKey(Name1): List{Name1:Value1, Name1:Value2}

MapKey(Name2): List{Name2:Value1}

MapKey(Name3): List{Name3:Value3}

如何使用stream()重写代码(2)得到同样的结果?

【问题讨论】:

    标签: java collections lambda java-8 java-stream


    【解决方案1】:

    您似乎正在实施标准的“分组依据”原语。 Streams API 开箱即用地支持这一点:

    Map<String, List<Item>> itemsByName = 
        list.stream().collect(Collectors.groupingBy(Item::getName));
    

    【讨论】:

    • 哇!太简单!我花了更多时间来写这个问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多