我有一个POJO Traveler,带有变量字符串名称,字符串城市。我有一个像
这样的字符串数组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。有没有一种方法可以映射到旅行者,并获得名称作为关键字和城市列表。
答案 0 :(得分:1)
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 comment:
作为结果,我想要一个以人的名字作为键和列表的地图 以城市为价值
在这种情况下,您必须使用:
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())));
答案 1 :(得分:1)
我没有看到将其转换为Traveller
对象的优势,因此您可以通过使用基于数组中名称的Collectors.groupingBy
和Collectors.mapping
来映射{{1 }}作为值
Cities (List<String>)