当前位置: 首页 > 知识库问答 >
问题:

对象列表的Groupby、reduce和sort

韦望
2023-03-14

我有一个标签列表,它有很少的属性,如标签名,标签类型,标签ID,点击,订阅者,每个标签的视图。tagName和tagType可以对每个tag对象重复,而tagId对每个tag是唯一的。

我想做一个这样的手术:

  1. 通过tagName和TagType组合对标记列表进行分组/聚合
  2. 对于每个组,我希望将聚合列表缩减为tagName和tagType的每个组合的单个元素。对于单个元素,tagId与我无关,甚至可以设置为null或任何标记对象的id。不过,我想在单个标记中总结点击、订阅者和视图。
  3. 最后,对于每个tagName和tagType减少的聚合单个标记对象,我希望根据用户指定的条件(如单击、订阅者或视图)对它们进行排序,并返回前5个标记对象。

为了实现这一点,我的代码片段如下所示:

Map<TempClass, List<Tag>> aggregatedMap = tags.stream()
                        .collect(groupingBy(t -> new TempClass(t.getTagName(), t.getTagType()));

class Tag {
   String tagName;
   String tagType;
   String tagId;
   Long clicks;
   Long subscribers;
   Long views;
}

class TempClass {
   String tagName;
   String tagType;
}

是否有什么可以做的与收集器在Java或我需要使用的循环来实现这一点?

共有1个答案

曾承弼
2023-03-14
public List<Tag> tags(List<Tag> input, long limit, Function<TempClass, Long> extractor) {
    List<Tag> result =
            input
                    .stream()
                    .collect(Collectors.toMap(
                            x -> new TempClass()
                                    .setTagName(x.getTagName())
                                    .setTagType(x.getTagType()),
                            Function.identity(),
                            (left, right) -> {
                                left.setClicks(left.getClicks() + right.getClicks());
                                left.setSubscribers(left.getSubscribers() + right.getSubscribers());
                                left.setViews(left.getViews() + right.getViews());
                                return left;
                            }
                    ))
                    .entrySet()
                    .stream()
                    .sorted(Map.Entry.comparingByKey(Comparator.comparing(extractor)))
                    .limit(limit)
                    .map(Map.Entry::getValue)
                    .collect(Collectors.toList());
    
    return result;
}

我对tempclass做了一点更改:

@EqualsAndHashCode(of = {"tagName", "tagType"})
@Getter
@Setter
@Accessors(chain = true)
private static class TempClass {
    String tagName;
    String tagType;
}

其余的应该相当容易掌握。

 类似资料:
  • 我使用带thymeleaf 3的Spring靴 我试着展示一个豆子 在我的控制器里我有 在我的车里 在我的位置 在我的胸腺碎片中 当我试图显示这个片段时,我得到 org.attoparser。ParseException:异常评估SpringEL表达式:“cities.id”由:org.springframework.expression.spel引起。SpelEvaluationExceptio

  • 我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?

  • 假设我有两个类C1和C2,其中C2由C1的构造函数使用: 现在,我有一个C2对象的列表(List list),我想使用从流式传输的C2对象创建的C1的getProperty()上的条件进行流和筛选。 有办法用溪流做到这一点吗? 我想我应该有XXXX,它使用流中的C2对象创建C1对象,并比较其getProperty()(例如,"value". equals(o2.get)) 这有可能吗?

  • 我该怎么做才能使这件事如我所愿?。谢谢 JSON对象示例列表 示例JSON对象: null 忽略不存在json字段的反序列化错误,但问题仍然存在。 示例:对象反序列化器

  • 给定: 我想把所有的车都标出来。将轮胎分为单独的轮胎板。我知道我可以做一个