我有一个包含 city
和 zip
字段的对象,我们称它为 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
,值是具有该 zip
的 Record
对象列表。
我现在想要获取的是每个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/