java - 使用 Stream 将 String 2D 数组映射到新对象

标签 java list java-stream

我有一个 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
  1. 在您的类中创建一个构造函数,其中包含城市和名称
  2. 群组名称
  3. 分组结果为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/

相关文章:

java - 编写 Java 谓词以将列表与另一个列表进行比较

Java FutureTask 异常

python - 如果列表中的9个字符串全部被替换: do something

java - Collectors#toList 的运行时复杂性

python - 如何按升序对整数列表进行排序?

具有事件元素的 Css 嵌套列表以填充整行

java - 如何打开 List<Map>,按 Map 键分组并按 Map 值缩减

java - 获取 java.lang.NoClassDefFoundError : com/google/gson/Gson

java - 使用泛型时是否需要使用 'instanceOf'?

java - 如何更改 NetBeans Java 项目运行时?