我有一个带有变量字符串名称的POJO Traveller,字符串城市。我有一个字符串数组,例如
List<String[]> events = Arrays
.asList(new String[][] { { "Person A", "City 1" },{ "Person A", "City 1" }, { "Person A", "City 2" }, { "Person B", "City 1" },
{ "Person B", "City 3" }, { "Person C", "City 2" }, { "Person C", "City 4" } });
我想要一张名称为键和城市列表的地图。
Map<String, List<String>> map = events.stream().map(traveller -> Traveller :: new).collect(Collectors.groupingBy(Traveller::getName));
我无法映射到旅行者。有没有办法映射到旅行者并将名称作为关键和城市列表。
Traveller::new
从数组创建对象是不正确的,你的方式不正确,而是你必须使用:
Map<String, List<Traveller>> map = events.stream()
.map(traveller -> new Traveller(traveller[0], traveller[1])) // 1
.collect(Collectors.groupingBy(Traveller::getName)); // 2
- 在类中创建一个构造函数,其中包含城市和名称
- 带名称的组
- 分组的结果
Map<String, List<Traveller>>
不是Map<String, List<String>>
来自OP评论:
我想要一张地图,其中人名作为键和列表 城市作为价值
在这种情况下,您必须使用:
Map<String, List<String>> map = events.stream()
.map(traveller -> new Traveller(traveller[0], traveller[1]))
.collect(Collectors.groupingBy(Traveller::getName,
Collectors.mapping(Traveller::getCity, Collectors.toList())));
但相反,我不会采用创建events
的方式,而是使用Traveller
而不是List<String[]>
List<Traveller> events = Arrays.asList(new Traveller("Person A", "City 1"), new Traveller("Person A", "City 1"),
new Traveller("Person A", "City 2"), new Traveller("Person B", "City 1"),
new Traveller("Person B", "City 3"), new Traveller("Person C", "City 2"), new Traveller("Person C", "City 4"));
然后你可以只使用:
Map<String, List<String>> collect = events.stream()
.collect(Collectors.groupingBy(Traveller::getName,
Collectors.mapping(Traveller::getCity, Collectors.toList())));
我没有看到将其转换为Traveller
对象的好处,因此您可以使用基于数组中名称的Collectors.groupingBy
直接执行分组,Collectors.mapping
将Cities (List<String>)
映射为值
Map<String, List<String>> res = events.stream().collect(Collectors.groupingBy(key -> key[0].split(" ")[1],
Collectors.mapping(val -> val[1].split(" ")[1], Collectors.toList())));