【发布时间】:2018-07-25 18:25:42
【问题描述】:
我有一个具有以下属性的 Catalog bean:
catalog_id
catalog_name
catalog_price
catalog_title
catalog_id不是唯一的,同一id可以有多个Catalog对象。
拥有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.
}
}
我不知道如何实现这个结构。
更新
我在我的 Eclipse 中收到消息 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());
【问题讨论】:
-
那是什么问题?
-
将
Collectors.counting()替换为Collectors.toList()将为您提供<String, List<Catalog>>的映射条目,而不是<String, Integer>。这足以解决您的问题吗?否则,请向我们详细说明您的问题所在。 -
@MalteHartwig 或删除下游收集器。
-
@Aominè true,在发布答案时意识到这一点。没有考虑太多,因为这个问题对于收集的实际目标还不清楚。
-
@instinct 你怎么知道属性
catalog_id的类型是int