lambda - Java 8 Lambda 表达式中的分组依据

标签 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(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();
        }
    }

我想将实体列表转换为公司对象。 Company 对象是一个嵌套结构。

包 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();
    }
}

位置对象:

package com.raghu.example2;

import java.util.List;

public class Location {

    private String locationName;

    private  List<Office> officeList;

    public Location(String locationName, List<Office> officeList) {
        super();
        this.locationName = locationName;
        this.officeList = officeList;
    }

    public String getLocationName() {
        return locationName;
    }

    public List<Office> getOfficeList() {
        return officeList;
    }



    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((locationName == null) ? 0 : locationName.hashCode());
        result = prime * result + ((officeList == null) ? 0 : officeList.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Location other = (Location) obj;
        if (locationName == null) {
            if (other.locationName != null)
                return false;
        } else if (!locationName.equals(other.locationName))
            return false;
        if (officeList == null) {
            if (other.officeList != null)
                return false;
        } else if (!officeList.equals(other.officeList))
            return false;
        return true;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Location [locationName=");
        builder.append(locationName);
        builder.append(", officeList=");
        builder.append(officeList);
        builder.append("]\n");
        return builder.toString();
    }



}

办公室:

package com.raghu.example2;

import java.util.List;

public class Office {

    private String name;
    private List<Building> listOfBuilding;

    public Office(String name, List<Building> listOfBuilding) {
        super();
        this.name = name;
        this.listOfBuilding = listOfBuilding;
    }

    public String getName() {
        return name;
    }

    public List<Building> getListOfBuilding() {
        return listOfBuilding;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("\n");
        builder.append("Office [name=");
        builder.append(name);
        builder.append(", listOfBuilding=");
        builder.append(listOfBuilding);
        builder.append("]");
        return builder.toString();
    }



}

建筑物:

package com.raghu.example2;

public class Building {

    private String name;

    private String address;

    public Building(String name, String address) {
        super();
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public String getAddress() {
        return address;
    }



    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((address == null) ? 0 : address.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Building other = (Building) obj;
        if (address == null) {
            if (other.address != null)
                return false;
        } else if (!address.equals(other.address))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Building [name=");
        builder.append(name);
        builder.append(", address=");
        builder.append(address);
        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]]]]]
]]

我想使用 java 8 group by 子句。

到目前为止我已经尝试过: 将所有位置分组

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))))));

map 输出:

{Mannar&Co={CHENNAI={urban=[sez10, sez11], sub-urban=[sez1, sez2]}, BANGALORE={urban=[sez10, sez11], sub-urban=[sez1, sez1]}}}

然后从该 map 填充公司对象

关于lambda - Java 8 Lambda 表达式中的分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211896/

相关文章:

amazon-web-services - 可以在 lambda 中订阅 aws IOT 主题吗?

Java8 lambda : concat list

java - 直接从字符串创建流

linq - 如何使用 Lambda 表达式加入 LINQ 并在 DTO 中获取结果?

c# - 编译的 C# lambda 表达式性能与叠层

Java8 Optional 如果为 null 则触发一个方法,如果不为 null 则触发另一个方法最佳方法

java - CentOS 7中通过jenkins构建时如何设置JRE和JDK的正确路径?

java - 使用不同的组合器和累加器进行流缩减的示例

c# - Entity Framework 同时根据2列排序

java - ComboBox onAction 方法导致由 ClassCastException 引起的 InitationTargetException