And*_*ose 8 java java-8 java-stream
我有一个对象city和zip字段,让我们称之为Record.
public class Record() {
private String zip;
private String city;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一些这些对象的集合,我zip使用以下代码对它们进行分组:
final Collection<Record> records; //populated collection of records
final Map<String, List<Record>> recordsByZip = records.stream()
.collect(Collectors.groupingBy(Record::getZip));
Run Code Online (Sandbox Code Playgroud)
所以,现在我有一个地图,其中键是,zip而值是一个Record对象列表zip.
我现在想要得到的是city每个人最常见的zip.
recordsByZip.forEach((zip, records) -> {
final String mostCommonCity = //get most common city for these records
});
Run Code Online (Sandbox Code Playgroud)
我想对所有流操作执行此操作.例如,我可以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()));
});
Run Code Online (Sandbox Code Playgroud)
但我希望能够进行单线流操作,这将只返回最频繁的操作city.
是否有任何Java 8流专家可以在这方面有所作为?
如果你想玩它,这是一个ideone沙盒.
您可以拥有以下内容:
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()
)
));
Run Code Online (Sandbox Code Playgroud)
这会按照其拉链和各个城市对每个记录进行分组,计算每个拉链的城市数量.然后,通过zip对城市数量的地图进行后处理,以仅保留具有最大数量的城市.
| 归档时间: |
|
| 查看次数: |
3223 次 |
| 最近记录: |