我有一个 POJO Traveler,其中包含变量 String name、String city。我有一个像
这样的字符串数组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 。
Map<String, List<String>> map = events.stream().map(traveller -> Traveller :: new).collect(Collectors.groupingBy(Traveller::getName));
我无法映射到 Traveller。有没有办法映射到旅行者并获取名称作为键和城市列表。
最佳答案
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 :
I want as the result a map with name of person as key and list of cities as the value
在这种情况下你必须使用:
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())));
关于java - 使用 Stream 将 String 2D 数组映射到新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59052369/