有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用Java8流从一个列表中创建一个以自定义对象列表为值的映射?

我有如下对象产品、客户机和产品模型 在main函数中,我试图创建一个映射,以key作为客户端名称,值将是productModel的列表

@Getter
@Setter
@AllArgsConstructor
class Client{
    String name;
    String location;
}

@Getter
@Setter
@AllArgsConstructor
class Product {
    String name;
    String value;
    String rating;
    Client client;
}

public class Test {
    public static void main(String[] args) {

    Client c1 = new Client("abc", "ldn");
Client c2 = new Client("lmn","nyc");
Client c3 = new Client("abc","eur");
Client c4 = new Client("xyz","ldn");

 Arrays.asList(new Product("tshirt", "v1", "4",c1),
               new Product("shoes", "v2","3",c2), 
               new Product("dress", "v3","2",c3), 
               new Product("belt", "v4","4",c4)
   .stream();

在此之后,如何创建一个映射,其中键是客户名称值是ShopModel的列表

@Getter
@Setter
@AllArgsConstructor
class ProductModel{
    String productName; // maps to name in Product
    String prouductValue; // maps to value in Product
    String location;// maps to location in client
}

最终地图输出应如下所示

Key Value
abc {tshirt, v1, ldn},
    {dress,  v3, eur}
lmn {shoes, v2, nyc}
xyz {belt, v4, ldn}
 

共 (1) 个答案

  1. # 1 楼答案

    下面的代码可能会有所帮助

     final Map<String, List<ProductModel>> collect = Arrays.asList(new Product("tshirt", "v1", "4", c1),
                    new Product("shoes", "v2", "3", c2),
                    new Product("dress", "v3", "2", c3),
                    new Product("belt", "v4", "4", c4))
                    .stream()
                    .collect(Collectors.groupingBy(e -> e.getClient().getName(),
                            Collectors.mapping(e -> new ProductModel(e.getName(), e.getValue(), e.getClient().getLocation()),
                                    Collectors.toList())
                    ));
    

    帮助链接->https://www.baeldung.com/java-groupingby-collector