使用Stream

时间:2019-11-26 13:46:00

标签: java list java-stream

我有一个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。有没有一种方法可以映射到旅行者,并获得名称作为关键字和城市列表。

2 个答案:

答案 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
  1. 在您的类中创建一个包含城市和名称的构造函数
  2. 具有名称的组
  3. 分组的结果是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.groupingByCollectors.mapping来映射{{1 }}作为值

Cities (List<String>)