我有一个具有以下属性的Catalog
bean:
catalog_id
catalog_name
catalog_price
catalog_title
catalog_id
不是唯一的,可以有多个Catalog
具有相同的id
的对象。
有一个Catalog
对象的列表,我想用相同的id
收集所有对象,在第二秒的for循环中,我要遍历该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
但是,在那之后,我想做以下事情:(它只是我要实现的结构)
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.
中获得消息
当尝试添加第二个sysout时:
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
我在日食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());
答案 0 :(得分:4)
在没有下游收集器的情况下使用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);
});
答案 1 :(得分:0)
您可以按照以下步骤进行操作:
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