遍历具有相同属性(catalog_id)的项目出现

时间:2018-07-25 09:20:01

标签: java arraylist java-8

我有一个具有以下属性的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());

2 个答案:

答案 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