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