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