首页 > 解决方案 > 获取对象列表的组

问题描述

我有一个称为卡车的 Java 类和另一个称为卡车零件的类。我想以波纹管指定的格式获取输出的集合。我已经尝试过对我不起作用的集合,并且给了我意想不到的结果。

public class Truck {
    private String name;
    private int qty;
    private BigDecimal price;
    private List<Integer> platIds = new ArrayList<>();
    // Constructor and getters and setters 

我还有一堂课:

public class TruckParts {
    private Integer id;
    private String namepart;
    private int qtypart;
    private BigDecimal pricepart;
    private Truck truck = new Truck();
    // Constructor and getters and setters 

我收到了以下对象列表形式的输入:

[
  {
    "id": 1,
    "namepart":"val",
    "qtypart":"fg",
    "pricepart":120,
    "name":"valasdhjk",
    "qty" :"sdfg",
    "price":123,
    "partid":1
   },
   {
    "id": 1,
    "namepart":"val",
    "qtypart":"fg",
    "pricepart":120,
    "name":"valasdhjk",
    "qty" :"sdfg",
    "price":123,
    "partid": 1
   },
   {
    "id": 2,
    "namepart":"val",
    "qtypart":"fg",
    "pricepart":120,
    "name":"valasdhjk",
    "qty" :"sdfg",
    "price":123,
    "partid":1
   },
   {
    "id": 2,
    "namepart":"val",
    "qtypart":"fg",
    "pricepart":120,
    "name":"valasdhjk",
    "qty" :"sdfg",
    "price":123,
    "partid":2
   }
]

现在我希望这个输出转换成这种形式:

[
  {
    "id": 1,
    "namepart":"val",
    "qtypart":"fg",
    "pricepart":120,
    "truck":{
            "name":"valasdhjk",
            "qty" :"sdfg",
            "price":123,
            "partids":[1,2]
     }

   },

   {
    "id": 2,
    "namepart":"val",
    "qtypart":"fg",
    "pricepart":120,
    "truck:"{
          "name":"valasdhjk",
          "qty" :"sdfg",
          "price":123,
          "partids":[1,2]
     }
   }
]

我试过用地图。

 Map<BigDecimal, List<TruckParts>> groupByid = 
        items.stream().collect(Collectors.groupingBy(TruckParts::getId));

但这似乎不是我想要的。有人可以告诉我获得此结果的最佳方法吗?

标签: javacollections

解决方案


你正朝着正确的方向前进:

 Map<BigDecimal, List<TruckParts>> groupById = 
        items.stream().collect(Collectors.groupingBy(TruckParts::getId));

有了它Map<BigDecimal, List<TruckParts>>,您可以将每个条目映射到一个Truck对象:

groupById.entrySet().stream().map(x -> {
    // assuming your constructor's parameters go in the order of name, qty, price, platIds
    return new Truck(x.getValue().get(0).getNamePart(), 
              x.getValue().get(0).getQtyPart(), 
              x.getValue().get(0).getPricePart(),
              x.getValue().stream().map(TruckPart::getPartId).collect(Collectors.toList()));
})

推荐阅读