将两个对象属性分组在一个列表中

Group two object attributes in a list

我想将具有不同值的重复对象转换为 java 中的列表,如下所示

[
  {
    "code": "code",
    "active": true,
    "car": "Sedan"
  },
  {
    "code": "code",
    "active": true,
    "car": "R4"
  },
  {
    "code": "code2",
    "active": false,
    "car": "Sedan"
  },
  {
    "code": "code2",
    "active": false,
    "car": "R4"
  }
]

Class一个

public class Car{

    private String code;
    private boolean active;
    private String car;

}

如果“code”和“active”相同,我想将它们分组到一个对象中

[
  {
    "code": "code",
    "active": true,
    "name": {
      "cars": [
        {
          "brand": "Sedan"
        },
        {
          "brand": "R4"
        }
      ]
    }
  },
  {
    "code": "code2",
    "active": false,
    "name": {
      "cars": [
        {
          "brand": "Sedan"
        },
        {
          "brand": "R4"
        }
      ]
    }
  }
]

Class 解析

public class CarParse{

    private String code;
    private String active;
    private Name name;

}

public class Name{

    private List<Brand> cars;

}

public class Brand{

    private String brand;

}

那么就是从ClassOne到ClassParse,将按“code”和“active”分组的对象进行转换

我发现先写非 更容易。

例如,将 code-active 上的输入对象分组将形成一个可以循环的唯一对,然后从

构建最终列表
public List<CarParse> getParsed(List<Car> cars) {
    Map<String, CarParse> codeMap = new HashMap<>();

    for (Car c : cars) {
      CarParse cp;
      List<Brand> brands;
      String code = c.getCode();
      boolean active = c.isActive();
      String group = String.format("%s-%s", code, active);
      Brand b = new Brand(c.getCar());
      if (codeMap.containsKey(group)) {
        cp = codeMap.get(group);
        brands = cp.getName().getCars();
        brands.add(b);
      } else {
        brands = new ArrayList<>();
        brands.add(b);
        Name n = new Name(brands);
        cp = new CarParse(code, active, n);
        codeMap.put(group, cp);
      }
    }

    return new ArrayList<>(codeMap.values());
}

流版本

return new ArrayList<>(cars.stream().collect(Collectors.toMap(
    c -> String.format("%s-%s", c.getCode(), c.isActive()),
    c -> {
      ArrayList<Brand> brands = new ArrayList<>();
      brands.add(new Brand(c.getCar()));
      return new CarParse(c.getCode(), c.isActive(), new Name(brands));
    },
    (v1, v2) -> {
      if (v1.isActive() == v2.isActive() && (v1.getCode().equals(v2.getCode()))) {
        for (Brand b : v2.getName().getCars()) {
          v1.getName().getCars().add(b);
        }
        return v1;
      }
      return v1;
    })).values());

输出

[ {
  "code" : "code",
  "active" : true,
  "name" : {
    "cars" : [ {
      "brand" : "Sedan"
    }, {
      "brand" : "R4"
    } ]
  }
}, {
  "code" : "code2",
  "active" : false,
  "name" : {
    "cars" : [ {
      "brand" : "Sedan"
    }, {
      "brand" : "R4"
    } ]
  }
} ]