代码之家  ›  专栏  ›  技术社区  ›  srzhio

使用值映射函数生成列表的java 8列表分组

  •  3
  • srzhio  · 技术社区  · 8 年前

    我有一个追随者

    public class Person {
    
        public String name;
    
        public List<Brand> brands;
    
        //Getters
    }
    

    List<Person> persons (可能同名)。我需要在地图中分组 <String, List<Brand>> 用人的 name 作为键和累积列表 Brands

    像这样的

     Map<String, List<List<String>>> collect = list.stream().collect(
            groupingBy(Person::getName, mapping(Person::getBrands, toList()))
     );
    

    5 回复  |  直到 8 年前
        1
  •  3
  •   Misha    8 年前

    java 9将添加 flatMapping 专门用于此类型任务的收集器:

    list.stream().collect(
        groupingBy(
            Person::getName, 
            flatMapping(
                p -> p.getBrands().stream(), 
                toList()
            )
        )
    
        2
  •  1
  •   Piotr Findeisen    8 年前

    toMap 收藏家:

    Map<String, List<String>> collect = persons.stream().collect(
        toMap(
                Person::getName,
                Person::getBrands,
                (l1, l2) -> ImmutableList.<String /*Brand*/>builder().addAll(l1).addAll(l2).build())
    );
    
        3
  •  1
  •   Eugene    8 年前

    你需要 合并 List :

    list.stream().collect(Collectors.toMap(
                Person::getName,
                Person::getBrands,
                (left, right) -> {
                    left.addAll(right);
                    return left;
                },
                HashMap::new));
    
        4
  •  1
  •   Joe C    8 年前

    您可以为您的下游创建自定义收集器 groupBy :

    Collector.of(LinkedList::new, 
                (list, person) -> list.addAll(person.brands), 
                (lhs, rhs) -> { lhs.addAll(rhs); return rhs; })
    
        5
  •  0
  •   123-xyz    8 年前

    MoreCollectors StreamEx

    list.stream().collect(
        groupingBy(Person::getName, MoreCollectors.flatMapping(p -> p.getBrands().stream()));