有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将列表a作为从流收集的映射中的值

我正试图从高级操作部分修改来自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)));

我得到的错误是:

Error:(32, 25) java: incompatible types: inference variable U has incompatible bound
equality constraints: java.lang.String
lower bounds: java.util.List

我如何让它工作


共 (2) 个答案

  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())));
    
  2. # 2 楼答案

    你可以这样做

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

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