如何使用 Collectors groupingBy 将频率映射到新对象?

How to map frequencies to a new object with Collectors groupingBy?

获取class个对象的描述频率:

public class Tag {  
    private int excerptID;
    private String description;
}

我使用 Collectors groupingBy + 计数函数:

Map<String, Long> frequencyMap = rawTags.stream().map(Tag::getDescription).collect(Collectors.groupingBy(e -> e, Collectors.counting()));

但是我想return这个结果作为一个新的对象class

 public class Frequency {
    private String Description;
    private Long frequency;
    }

而不是 Map<String, Long>。有什么简单的方法可以做到?

您可以获取 entrySet 的地图并转换为 Frequency class 并收集为 List。

rawTags.stream()
       .map(Tag::getDescription)
       .collect(Collectors.groupingBy(e -> e, Collectors.counting()))
       .entrySet()
       .stream()
       .map(e -> new Frequency(e.getKey(), e.getValue()))
       .collect(Collectors.toList());

或使用Collectors.collectingAndThen

rawTags.stream()
    .map(Tag::getDescription)
    .collect(Collectors.groupingBy(e -> e,
              Collectors.collectingAndThen(Collectors.toList(),
                                e -> new Frequency(e.get(0), Long.valueOf(e.size())))));