【问题标题】:Looping through item occurences with same property (catalog_id)循环遍历具有相同属性(目录 ID)的项目出现
【发布时间】: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() 将为您提供&lt;String, List&lt;Catalog&gt;&gt; 的映射条目,而不是&lt;String, Integer&gt;。这足以解决您的问题吗?否则,请向我们详细说明您的问题所在。
  • @MalteHartwig 或删除下游收集器。
  • @Aominè true,在发布答案时意识到这一点。没有考虑太多,因为这个问题对于收集的实际目标还不清楚。
  • @instinct 你怎么知道属性catalog_id 的类型是int

标签: java arraylist java-8


【解决方案1】:

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

【讨论】:

  • 它的打印是这样的`目录ID:17553:8 com.jci.vb2.searchengine.bean.Catalog@304e5f60 com.jci.vb2.searchengine.bean.Catalog@53d55f54 com.jci.vb2 .searchengine.bean.Catalog@3bb87e2e com.jci.vb2.searchengine.bean.Catalog@5e9f8a1a com.jci.vb2.searchengine.bean.Catalog@1ce86bf6 com.jci.vb2.searchengine.bean.Catalog@65bea8c0 com.jci .vb2.searchengine.bean.Catalog@1d0ff357 com.jci.vb2.searchengine.bean.Catalog@3f6265b6`。
  • @Karthikeyan 覆盖 toString() 类的 Catalog 方法
  • 来自内部循环。,我正在尝试像catalog.getName()catalog.getTitle() 这样的东西打印..
  • @Karthikeyan 然后将System.out::println 替换为catalog -&gt; System.out.println("whatever you want to print")
  • @Karthikeyan 显然,您已经在第二次编辑中显示的代码段之外定义了 catalog 变量。转储您定义catalog 变量的代码段,它必须是有效的最终含义,一旦您将其设置为一个值,您无需再次重新分配新值。
【解决方案2】:

你可以这样做:

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

【讨论】:

  • 这不会授予对特定 ID 的 Catalog 对象的访问权限,因为 collect 只会为您提供计数。
猜你喜欢
  • 2019-06-21
  • 2013-12-03
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多