java - 从 Java 8 流中以最大频率获取对象

标签 java java-8 java-stream

我有一个包含 cityzip 字段的对象,我们称它为 Record

public class Record() {
    private String zip;
    private String city;

    //getters and setters
}

现在,我收集了这些对象,并使用以下代码按 zip 对它们进行分组:

final Collection<Record> records; //populated collection of records
final Map<String, List<Record>> recordsByZip = records.stream()
    .collect(Collectors.groupingBy(Record::getZip));

所以,现在我有一个 map ,其中键是 zip,值是具有该 zipRecord 对象列表。

我现在想要获取的是每个zip最常见的city

recordsByZip.forEach((zip, records) -> {
    final String mostCommonCity = //get most common city for these records
});

我想对所有流操作执行此操作。例如,通过执行以下操作,我可以获得每个 city 的频率图:

recordsByZip.forEach((zip, entries) -> {
    final Map<String, Long> frequencyMap = entries.stream()
        .map(GisSectorFileRecord::getCity)
        .filter(StringUtils::isNotBlank)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
});

但我希望能够执行单行流操作,只返回最频繁的 city

是否有任何 Java 8 流专家可以对此施展魔法?

这是一个 ideone sandbox如果您想尝试一下。

最佳答案

你可以有以下内容:

final Map<String, String> mostFrequentCities =
  records.stream()
         .collect(Collectors.groupingBy(
            Record::getZip,
            Collectors.collectingAndThen(
              Collectors.groupingBy(Record::getCity, Collectors.counting()),
              map -> map.entrySet().stream().max(Map.Entry.comparingByValue()).get().getKey()
            )
         ));

这会将每条记录按 zip 和城市分组,计算每个 zip 的城市数量。然后,通过 zip 对城市数量的 map 进行后处理,以仅保留具有最大数量的城市。

关于java - 从 Java 8 流中以最大频率获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39538089/

相关文章:

java - 从java调用python

java - 如何封装 Java Streams 操作

java - 如何从对象列表中获取java中列表中最匹配的对象?

java - 了解 Eureka 客户端缓存

java - Hamcrest - 使用什么版本? 1.3 或 2

Java 8 中断 forEach 与替代操作

Java 8 Streams在过滤map后获取原始对象

java - 如何从 Java 8 中的流中收集自定义类对象?

java - 在 SVG 中创建图像并使用 Base64 编码 URI 和 JAVA 在 HTML 中渲染它们

java-8 - 两个简单的 IBM MQ 客户端测试写入 MQ 队列 - 为什么一个有效,而另一个无效?