在从流收集的地图中将a列为值

时间:2018-07-09 16:24:23

标签: java java-stream

我正在尝试从高级操作部分的http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/修改源代码,以获取结果类型为Map<Integer, List<String>>而不是其中值是串联字符串的Map<Integer, String>多个值。

    List<Person> persons =
            Arrays.asList(
                    new Person("Max", 18),
                    new Person("Peter", 23),
                    new Person("Pamela", 23),
                    new Person("David", 12)
            );

    Map<Integer, String> collect = persons.stream()
            .collect(Collectors.toMap(p -> p.age, p -> Arrays.asList(p -> p.name)));

我得到的错误是:

  

错误:(32,25)java:不兼容的类型:推断变量U具有不兼容的绑定
  相等约束:java.lang.String
  下限:java.util.List

我如何使其工作?

2 个答案:

答案 0 :(得分:1)

您可以这样做

Map<Integer, List<String>> namesByAge = persons.stream()
    .collect(Collectors.groupingBy(Person::getAge, Collectors.mapping(Person::getName, Collectors.toList())));

您必须首先根据人员的年龄将其分组,然后获取具有该年龄的人员的姓名,最后使用下游收集器进行收集。

答案 1 :(得分:1)

结合使用Collectors.groupingByCollectors.mapping

Map<Integer, List<String>> result = persons.stream()
            .collect(Collectors.groupingBy(p -> p.age,
                    Collectors.mapping(p -> p.name, Collectors.toList())));