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

Hac*_*ckU 3 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

由此(1)

List<Item> list = db.query(sqlStatement, (rs, i) -> new Item(rs));
Run Code Online (Sandbox Code Playgroud)

我得到的项目列表看起来像:

list(0):Name1:Value1

list(1):Name1:Value2

list(2):Name2:Value1

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想得到:

MapKey(Name1):列表{Name1:Value1,Name1:Value2}

MapKey(Name2):列表{Name2:Value1}

MapKey(Name3):列出{Name3:Value3}

如何使用stream()重写代码(2)以获得相同的结果?

Wil*_*son 5

您似乎正在实施标准的"分组依据"原语.Streams API支持开箱即用:

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