Java 8 使用 stream() 将 List<Object> 提取/转换为 Map<String, List<String>>

标签 java collections lambda java-8 java-stream

试图弄清楚如何在我的代码中有效地使用新的 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):Name1:Value1

列表(1):Name1:Value2

列表(2):Name2:Value1

列表(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) 以获得相同的结果?

最佳答案

您似乎正在实现标准的“group by”原语。 Streams API 开箱即用地支持这一点:

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

关于Java 8 使用 stream() 将 List<Object> 提取/转换为 Map<String, List<String>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24821445/

相关文章:

c++ - 可变参数模板中的 Lambda

git - AWS CloudFormation 如何从 Git 中提取代码?

java - 使用 tomcat 7 从项目中删除 SSL 证书

java - 使用 SeekBar 实时更新屏幕亮度

java - 在 Java 中运行 For 循环超过十亿次

java - 如何使用 Stream 拆分集合中的奇数和偶数以及两者的总和

c++ - 如何将删除器传递给 shared_ptr 持有的同一类中的方法

java - 使用 Hibernate 连接子类,是否可以复制 super 表和子表中的列*并*保持它们同步?

java - new HashMap(int) 和 guava Maps.newHashMapWithExpectedSize(int) 的区别

java - 最终不可修改的集合线程安全吗?