代码之家  ›  专栏  ›  技术社区  ›  Karthikeyan

在具有相同属性(目录id)的项发生之间循环

  •  2
  • Karthikeyan  · 技术社区  · 6 年前

    我有一个 Catalog 具有以下属性的bean:

    catalog_id
    catalog_name
    catalog_price
    catalog_title
    

    catalog_id 不是唯一的,可以有多个 目录 相同的对象 id .

    有一个清单 目录 对象,我想用相同的 身份证件 在第二个for循环中,我想通过发生的次数循环 身份证件 .

    比如说:

    catalogList2.stream()
            .collect(Collectors.groupingBy(Catalog::getId, Collectors.counting()))
            .entrySet()
            .stream()
            .map(p->"catalog id--->"+p.getKey()+"    -"+p.getValue()).forEach(System.out::println);
    

    从上面的代码中,我可以得到以下输出:

    catalog id--->17553    -- 8
    catalog id--->545    -- 8
    catalog id--->546    -- 6
    catalog id--->40962    -- 16
    catalog id--->901    -- 12
    

    但是,在那之后我想做如下工作:(这只是一个我想实现的结构)

    for(Catalog cat1:p.getKey()){
    
        for(int i=0;i<p.getValue();i++){
    
            System.out.println("Name -->"+cat1.get(i)));
            //Something i will do here.
    
        }
    
    }
    

    我不知道如何实现这个结构。

    更新

    在我的日食中得到信息 Lambda expression's parameter catalog cannot redeclare another local variable defined in an enclosing scope.

    当我试图添加第二个系统输出时:

     catalogList2.stream()
        .collect(Collectors.groupingBy(Catalog::getId))
        .forEach((id, catalogs) -> {
            System.out.println("Catalog id : " + id + " : " + catalogs.size());
            catalogs.forEach(catalog -> {
                System.out.println("Name -->"+catalog.getCatalog_attr_name());
                System.out.println("Value --->"+catalog.getCatalog_attr_value());
            });
        });
    

    更新2

    我在eclipse中收到这个消息 Local variable catalog defined in an enclosing scope must be final or effectively final

    排队 String catalogName=catalog.getCatalog_name(); // getting error on this line

    请在这里找到我的代码;

    JSONObject jsonObj=null;
    JSONArray respArray=new JSONArray();
    catalogList2.stream()
    .collect(Collectors.groupingBy(Catalog::getId))
    .forEach((id, catalogs) -> {
        System.out.println("Catalog id : " + id + " : " + catalogs.size());
        String catalogName=catalog.getCatalog_name();  // getting error on this line
        String longDescriptionStr = catalogName.concat("_long_description");
        String descriptionStr = catalogName.concat("_description");
        jsonObj.put("catalog_id", id);
        catalogs.forEach(c -> {
            String longDescription=null;
            String description=null;
            String catalogAttrName = c.getCatalog_attr_name();
            if(StringUtils.equalsIgnoreCase(catalogAttrName, longDescriptionStr)) {
                 longDescription = c.getCatalog_attr_value();
            }
            if(StringUtils.equalsAnyIgnoreCase(catalogAttrName, descriptionStr)) {
                description = c.getCatalog_attr_value();
            }
            jsonObj.put("description", description);
            jsonObj.put("longDescription", longDescription);
    
        });
        respArray.put(jsonObj);
    
    });
    System.out.println("Printing JSON Array --->"+respArray.toString());
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   Malte Hartwig Darren Gunning    6 年前

    使用 groupingBy 如果没有下游收集器,则会将id映射到具有这些id的目录列表。然后,您可以询问列表的大小以获取计数,并遍历列表以获取每个目录:

    catalogList2.stream()
        .collect(Collectors.groupingBy(Catalog::getId))
        .forEach((id, catalogs) -> {
            System.out.println("Catalog id : " + id + " : " + catalogs.size());
            catalogs.forEach(System.out::println);
        });
    
        2
  •  0
  •   Aman Chhabra    6 年前

    您可以按以下步骤操作:

    catalogList
    .stream()
    .collect(Collectors.groupingBy(Catalog::getId))
    .forEach((key,value)->{
        for(Catalog curValue:value)
            System.out.println("Name -->"+curValue.catalog_name);
        });
    

    输出:

    Name -->Catalog 2
    Name -->Catalog 3
    Name -->Catalog 4
    Name -->Catalog 1
    Name -->Catalog 7
    Name -->Catalog 8
    Name -->Catalog 9
    Name -->Catalog 15
    Name -->Catalog 16
    Name -->Catalog 18
    Name -->Catalog 19
    Name -->Catalog 20