【问题标题】:Map a String 2D array to a new object using Stream使用 Stream 将 String 2D 数组映射到新对象
【发布时间】:2019-11-26 13:46:00
【问题描述】:

我有一个 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));

我无法映射到旅行者。有没有办法映射到 Traveler 并将名称作为键和城市列表。

【问题讨论】:

  • 你想把字符串数组映射到对象吗?
  • 我不想映射到对象

标签: java list java-stream


【解决方案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
  1. 在您的类中创建一个构造函数,其中包含城市和名称
  2. 有名字的组
  3. 分组的结果是Map&lt;String, List&lt;Traveller&gt;&gt;而不是Map&lt;String, List&lt;String&gt;&gt;

来自 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&lt;String[]&gt;

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 有一个有2个参数的构造函数。
  • 是的@Amongalen 我正在写,我没有完成我的答案
  • 我想要一张地图,其中人名作为键,城市列表作为值
【解决方案2】:

我没有看到将其转换为Traveller对象的好处,因此您可以直接使用Collectors.groupingBy基于数组中的名称和Collectors.mappingCities (List&lt;String&gt;)映射为值进行分组

Map<String, List<String>> res = events.stream().collect(Collectors.groupingBy(key -> key[0].split(" ")[1],
            Collectors.mapping(val -> val[1].split(" ")[1], Collectors.toList())));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2022-11-24
    • 1970-01-01
    相关资源
    最近更新 更多