Java 通过具有相同属性(目录id)的项目发生循环

Java 通过具有相同属性(目录id)的项目发生循环,java,arraylist,java-8,Java,Arraylist,Java 8,我有一个Catalogbean,具有以下属性: catalog_id catalog_name catalog_price catalog_title catalog\u id不是唯一的,可以有多个catalog对象具有相同的id 有了目录对象的列表,我想收集所有具有相同id的对象,并在一秒钟内通过该id的出现次数进行循环 比如说: catalogList2.stream() .collect(Collectors.groupingBy(Catalog::getId, Coll

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

catalog_id
catalog_name
catalog_price
catalog_title
catalog\u id
不是唯一的,可以有多个
catalog
对象具有相同的
id

有了
目录
对象的列表,我想收集所有具有相同
id
的对象,并在一秒钟内通过该
id
的出现次数进行循环

比如说:

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
但是,在那之后,我想做如下事情:(这只是我想要实现的一个结构)

更新2

在封闭范围内定义的eclipse
局部变量目录中收到此消息必须是final或有效final

在第行
String catalogName=catalog.getCatalog_name();//获取此行错误

请在这里找到我的代码

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

您可以按以下方式进行操作:

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

在没有下游收集器的情况下使用
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);
    });

那么问题出在哪里呢?用
收集器替换
收集器.counting()
。toList()
将为您提供
的映射条目,而不是
。这足以解决你的问题吗?否则,请详细告诉我们您的问题所在。@MalteHartwig,或者干脆删除下游收集器。@Aominètrue,在发布答案时意识到了这一点。没有考虑太多,因为这个问题对于collect的实际目标相当不清楚。@institute您如何知道属性
catalog\u id
是否为
int
类型,这将无法访问某个id的
catalog
对象,因为
collect
只提供计数。它的打印方式类似于这个目录id:17553:8com.jci.vb2.searchengine.bean。Catalog@304e5f60com.jci.vb2.searchengine.bean。Catalog@53d55f54com.jci.vb2.searchengine.bean。Catalog@3bb87e2ecom.jci.vb2.searchengine.bean。Catalog@5e9f8a1acom.jci.vb2.searchengine.bean。Catalog@1ce86bf6com.jci.vb2.searchengine.bean。Catalog@65bea8c0 com.jci.vb2.searchengine.bean。Catalog@1d0ff357com.jci.vb2.searchengine.bean。Catalog@3f6265b6`.@Karthikeyan从内部循环重写
Catalog
类上的
toString()
方法,我试图像
Catalog.getName()
Catalog.getTitle()那样打印
类似的内容。@Karthikeyan然后将
System.out::println
替换为
catalog->System.out.println(“您想要打印的内容”)
@Karthikeyan显然,您已经在第二次编辑中显示的代码段之外定义了
catalog
变量。转储定义了
catalog
变量的代码段,它必须是有效的最终含义一旦将其设置为值,则无需再次重新分配新值。
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
catalogList2.stream()
    .collect(Collectors.groupingBy(Catalog::getId))
    .forEach((id, catalogs) -> {
        System.out.println("Catalog id : " + id + " : " + catalogs.size());
        catalogs.forEach(System.out::println);
    });