私はcity
とzip
というフィールドを持つオブジェクトを持っています。それをRecord
としましょう。Java 8ストリームから最大頻度のオブジェクトを取得する
public class Record() {
private String zip;
private String city;
//getters and setters
}
は今、私は次のコードを使用してzip
することにより、これらのオブジェクトのコレクション、およびIグループにそれらを持っている:
final Collection<Record> records; //populated collection of records
final Map<String, List<Record>> recordsByZip = records.stream()
.collect(Collectors.groupingBy(Record::getZip));
そうに、今私は鍵がzip
とされたマップを持っています値はzip
のRecord
オブジェクトのリストです。
それぞれzip
のうち、最も一般的なのはcity
です。
recordsByZip.forEach((zip, records) -> {
final String mostCommonCity = //get most common city for these records
});
これはすべてのストリーム操作で行いたいと思います。
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
:たとえば、私はこれを行うことにより、各city
用周波数のマップを取得することができています。
これにいくつかの魔法を働かせることができるJava 8ストリームガウスがありますか?
ここでは遊びたい場合はideone sandboxです。
'collectingAndThen'私は何か不足していることを知っていましたが、私は常に代わりに'マッピング 'を考えています。 +1 –
'.max()'によって返された 'Optional'が' .get() 'を呼び出す前にストリーム操作に存在するかどうかを調べる方法はありますか? –
@AndrewMairoseはい、 '.get()'はここで呼び出すのが安全です。マップは空ではありません。少なくとも、少なくともzipでグループ化された都市が含まれている必要があります。 – Tunaki