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]}}}