Java8Lambda表达式中的分组依据

Java8Lambda表达式中的分组依据,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我有一个公司实体对象列表 package com.raghu.example2; public class CompanyEntity { private String name; private String locationName; private String officeName; private String buildingName; public CompanyEntity(Str

我有一个公司实体对象列表

package com.raghu.example2;
    public class CompanyEntity {

        private String name;

        private String locationName;

        private String officeName;

        private String buildingName;


        public CompanyEntity(String name, String locationName, String officeName, String buildingName) {
            super();
            this.name = name;
            this.locationName = locationName;
            this.officeName = officeName;
            this.buildingName = buildingName;
    //      System.out.println(this);
        }

        public String getName() {
            return name;
        }

        public String getLocationName() {
            return locationName;
        }

        public String getOfficeName() {
            return officeName;
        }

        public String getBuildingName() {
            return buildingName;
        }

        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
            builder.append("CompanyEntity [name=");
            builder.append(name);
            builder.append(", locationName=");
            builder.append(locationName);
            builder.append(", officeName=");
            builder.append(officeName);
            builder.append(", buildingName=");
            builder.append(buildingName);
            builder.append("]");
            return builder.toString();
        }
    }
我想将实体列表转换为公司对象。公司对象是嵌套结构

包com.raghu.example2

导入java.util.List

public class Company {

    private String name;

    private List<Location> locationList;

    public Company(String name, List<Location> locationList) {
        super();
        this.name = name;
        this.locationList = locationList;
    }

    public String getName() {
        return name;
    }


    public List<Location> getLocationList() {
        return locationList;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Company [name=");
        builder.append(name);
        builder.append(", locationList=");
        builder.append(locationList);
        builder.append("]");
        return builder.toString();
    }
}
公司实体名单:

[
CompanyEntity 
[name=Mannar&Co, locationName=CHENNAI, officeName=sub-urban, buildingName=sez1], CompanyEntity 
[name=Mannar&Co, locationName=CHENNAI, officeName=sub-urban, buildingName=sez2], CompanyEntity 
[name=Mannar&Co, locationName=CHENNAI, officeName=urban, buildingName=sez10], CompanyEntity 
[name=Mannar&Co, locationName=CHENNAI, officeName=urban, buildingName=sez11], CompanyEntity 
[name=Mannar&Co, locationName=BANGALORE, officeName=sub-urban, buildingName=sez1], 
CompanyEntity 
[name=Mannar&Co, locationName=BANGALORE, officeName=sub-urban, buildingName=sez2], 
CompanyEntity [name=Mannar&Co, locationName=BANGALORE, officeName=urban, buildingName=sez10], 
CompanyEntity 
[name=Mannar&Co, locationName=BANGALORE, officeName=urban, buildingName=sez11]]
总共有8个对象。我想按地点、办公室、建筑进行分组

我想要一个像下面这样的结构

Company [name=Mannar&Co, 
locationList=
[Location [locationName=CHENNAI, 
   officeList=[
          Office [name=sub-urban, 
               listOfBuilding=
                      [Building [name=sez1, address=sholinganallur],
                       Building [name=sez2, address=navallur]]], 
          Office [name=urban, 
               listOfBuilding=
                      [Building [name=sez10, address=t-nagar], 
                       Building [name=sez11, address=velacherry]]]]]
, Location [locationName=BANGALORE, 
    officeList=[
              Office [name=sub-urban, 
                       listOfBuilding=
                         [Building [name=sez1, address=sarjapur], Building [name=sez2, address=marathahalli]]], 
Office [name=urban, listOfBuilding=[Building [name=sez10, address=m.g.road], Building [name=sez11, address=c.v.raman nagar]]]]]
]]
我想使用Java8 GROUPBY子句

到目前为止,我所尝试的: 将所有位置分组

Map<String,List<CompanyEntity>> map1 =
     listOfCompanies.stream().collect(Collectors.groupingBy(CompanyEntity::getLocationName));
map1.forEach((k,v)->System.out.println("\n"+ k + " Group BY " + v + "\n"));
map1=
companies.stream().collect(Collectors.groupingBy(CompanyEntity::getLocationName));
map1.forEach((k,v)->System.out.println(“\n”+k+”按“+v+”\n”)分组);
将所有办公室分组:

Map<String,List<CompanyEntity>> map2 =listOfCompanies.stream().collect(Collectors.groupingBy(CompanyEntity::getOfficeName));
map2.forEach((k,v)->System.out.println("\n"+ k  + " Group BY " + v + "\n"));
Map map2=listOfCompanies.stream().collect(Collectors.groupingBy(CompanyEntity::getOfficeName));
map2.forEach((k,v)->System.out.println(“\n”+k+”按“+v+”\n”)分组);

如何进行多级分组并访问嵌套对象?

您可以执行以下操作:

Map<String, Map<String, Map<String, List<String>>>> map = list.stream()
            .collect(Collectors.groupingBy(CompanyEntity::getName,
                    Collectors.groupingBy(CompanyEntity::getLocationName,
                    Collectors.groupingBy(CompanyEntity::getOfficeName,
                            Collectors.mapping(CompanyEntity::getBuildingName, Collectors.toCollection(ArrayList::new))))));

然后从该映射填充Company对象

收集器。toCollection(ArrayList::new)
可以替换为
收集器。toList()
@andreTobilko在当前实现下是的,通常不是。@Eugene,为什么不能一般使用?@andreTobilko类型、可变性、可序列化性没有保证,或{@code List}从
toList
返回的文档的线程安全性。
Map<String,List<CompanyEntity>> map1 =
     listOfCompanies.stream().collect(Collectors.groupingBy(CompanyEntity::getLocationName));
map1.forEach((k,v)->System.out.println("\n"+ k + " Group BY " + v + "\n"));
Map<String,List<CompanyEntity>> map2 =listOfCompanies.stream().collect(Collectors.groupingBy(CompanyEntity::getOfficeName));
map2.forEach((k,v)->System.out.println("\n"+ k  + " Group BY " + v + "\n"));
Map<String, Map<String, Map<String, List<String>>>> map = list.stream()
            .collect(Collectors.groupingBy(CompanyEntity::getName,
                    Collectors.groupingBy(CompanyEntity::getLocationName,
                    Collectors.groupingBy(CompanyEntity::getOfficeName,
                            Collectors.mapping(CompanyEntity::getBuildingName, Collectors.toCollection(ArrayList::new))))));
{Mannar&Co={CHENNAI={urban=[sez10, sez11], sub-urban=[sez1, sez2]}, BANGALORE={urban=[sez10, sez11], sub-urban=[sez1, sez1]}}}