Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以object作为键的Java 8 stream groupingBy对象字段_Java_Java Stream - Fatal编程技术网

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