以object作为键的Java 8 stream groupingBy对象字段
我有以下的类结构(给出的示例毫无意义,我只是为了提问而做的):以object作为键的Java 8 stream groupingBy对象字段,java,java-stream,Java,Java Stream,我有以下的类结构(给出的示例毫无意义,我只是为了提问而做的): 公共类制造商RDTO{ 私有字符串名称; 具有确认功能的私有布尔值; //为简洁起见省略了getter和setter } 公共类卡片{ 私人制造商对制造商; //为简洁起见省略了getter和setter } 公共抽象类{ 私家车列表=新的ArrayList(); //为简洁起见省略了getter和setter } 公共级EuropeanMarketCard将车辆扩展至{ 公共地图getCarManufacturerToCarsMa
公共类制造商RDTO{
私有字符串名称;
具有确认功能的私有布尔值;
//为简洁起见省略了getter和setter
}
公共类卡片{
私人制造商对制造商;
//为简洁起见省略了getter和setter
}
公共抽象类{
私家车列表=新的ArrayList();
//为简洁起见省略了getter和setter
}
公共级EuropeanMarketCard将车辆扩展至{
公共地图getCarManufacturerToCarsMap(){
返回这个。getCarDtos()
.stream()
.collect(Collectors.groupingBy(e->e.manufacturer().getName());
//为简洁起见省略了getter和setter
}
}
在给定的场景中,
groupingBy
返回我想要的几乎所有内容,但是我对键有一个问题。在getCarManufacturerToCarsMap()
方法中,我希望有一个manufacturer
对象作为键,但我甚至不确定使用groupingBy
是否可行。要返回map
的映射,我该怎么办?您可以尝试以下方法:
Map<Manufacturer, List<Car>> listing = cars.stream().collect(Collectors.groupingBy(Car::getManufacturer));
Map list=cars.stream().collect(Collectors.groupingBy(Car::getManufacturer));
因此,这将根据制造商对所有汽车进行分组,输出类似于:
丰田=[AURIS的AURIS参数,AVIA的AVIA参数],梅赛德斯=[S500的AVIA参数]
S500…]
编辑2
public class Main {
List<Car> listOfCars = new ArrayList<>();
public static void main(String[] args) {
List<Car> listOfCars = new ArrayList<>();
listOfCars.add(new Car(new Manufacturer("Toyota"), "Toyota A"));
listOfCars.add(new Car(new Manufacturer("Toyota"), "Toyota B"));
listOfCars.add(new Car(new Manufacturer("Jeep"), "Jeep A"));
listOfCars.add(new Car(new Manufacturer("Mercedes"), "Mercedes C"));
listOfCars.add(new Car(new Manufacturer("Toyota"), "Toyota C"));
listOfCars.add(new Car(new Manufacturer("Audi"), "Audi A"));
listOfCars.add(new Car(new Manufacturer("Toyota"), "Toyota C"));
Map<String,List<Car>> listOfCarsByManufacturers = listOfCars.stream().collect(Collectors.groupingBy(d->d.getManufacturer().getName()));
System.out.println(listOfCarsByManufacturers);
}
}
public class Car {
private Manufacturer manufacturer;
private String nameOfTheCar;
public Car() {
}
public Car(Manufacturer manufacturer, String nameOfTheCar) {
this.manufacturer = manufacturer;
this.nameOfTheCar = nameOfTheCar;
}
public Manufacturer getManufacturer() {
return manufacturer;
}
public String getNameOfTheCar() {
return nameOfTheCar;
}
@Override
public String toString() {
return "Manufacturer: " + getManufacturer() + ", name: " + getNameOfTheCar();
}
}
public class Manufacturer {
private String name;
public Manufacturer() {
}
public Manufacturer(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return getName();
}
}
公共类主{
List listOfCars=new ArrayList();
公共静态void main(字符串[]args){
List listOfCars=new ArrayList();
添加(新车(新制造商(“丰田”),“丰田A”);
添加(新车(新制造商(“丰田”),“丰田B”);
添加(新车(新制造商(“吉普”),“吉普A”);
添加(新车(新制造商(“梅赛德斯”)、“梅赛德斯C”);
添加(新车(新制造商(“丰田”),“丰田C”);
添加(新车(新制造商(“奥迪”)、“奥迪A”);
添加(新车(新制造商(“丰田”),“丰田C”);
Map listOfCarsByManufacturers=listOfCars.stream().collect(Collectors.groupingBy(d->d.getManufacturer().getName());
System.out.println(CarsbyManufacturers列表);
}
}
公车{
私营制造商;
汽车的私有字符串名称;
公共汽车{
}
公共汽车(制造商,汽车的字符串名称){
这个。制造商=制造商;
this.nameofcar=汽车的名称;
}
公共制造商getManufacturer(){
退货制造商;
}
公共字符串getNameOfCar(){
返回汽车的名称;
}
@凌驾
公共字符串toString(){
返回“制造商:”+getManufacturer()+”,名称:“+GetNameOfCar()”;
}
}
公共类制造商{
私有字符串名称;
公共制造商(){
}
公共制造商(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@凌驾
公共字符串toString(){
返回getName();
}
}
编辑3:
Map<String,List<Car>> listOfCarsByManufacturers = listOfCars.stream().collect(Collectors.groupingBy(d->d.getManufacturer().getName()));
System.out.println(listOfCarsByManufacturers);
Map listOfCarsByManufacturers=listOfCars.stream().collect(Collectors.groupingBy(d->d.getManufacturer().getName());
System.out.println(CarsbyManufacturers列表);
如果您确实希望避免将映射键作为字符串,即映射
,而是使用映射
,您可以按以下方式进行分组:
this.getCarDtos()
.stream()
.collect(Collectors.groupingBy(e -> e.getManufacturer()));
请注意,这将要求您重写Manufacturer
类中的equals
和hashcode
方法,定义两个给定对象如果名称相同,则它们是相等的。我如何知道,该Car::getManufacturer
按name
字段分组,而不是按ManufacturerDto
中的其他字段分组(如f.e.带确认的
)?它按制造商分组,而不是按名称或其他任何内容。。这种特殊的制造商将被称为smt类制造商。toString=[all cars]如果您只需要制造商的名称,请查看编辑3。我认为,您的编辑2是正确的,只要我为toString()
方法(在Manufacturer
中)提供一个我要分组的字段。edit3的问题是它给了我一个类型为String
的键,而这正是我想要避免的(在本例中,我正在考虑如何获取对象-manufacturer
)。谢谢,我很感激。我确实做到了。但我不能处理分类。它不想工作.sorted(Comparator.comparating(e->e.getManufacturer().getProductionDateInInstant())
(我得到一个类型为Instant
)的字段@user3529850请发布一个新问题。确保包括你的尝试,说明什么是不工作的,如果我有时间,我会给它一看。
this.getCarDtos()
.stream()
.collect(Collectors.groupingBy(e -> e.getManufacturer()));