user11376058:
私は都市の数で家のリストを持っています。私は、各都市の中で最も高価な家のリストを生成するためにフィルタを使用しようとしています。私は、従来のループを使用することができません。
//This returns unique City Names
List unique = obList.stream()
.map(x -> x.getCity())
.distinct()
.sorted()
.collect(Collectors.toList());
//This returns the house with the highest price in that city
RAddress obReturn = obList.stream()
.filter(x -> x.getCity().equalsIgnoreCase(sName))
.sorted((x,y) -> (int)(y.getPrice() - x.getPrice()))
.findFirst()
.get();
私はいくつかの方法でこれらを組み合わせること、この問題に必要であることを理解するが、私は私の人生をどのように把握することはできませんのために...
任意およびすべてのヘルプは大歓迎です。
アンディ・ターナー:
使用groupingBy
一緒に各都市のすべての住宅を収集するコレクターを。その後、下流使用しmaxBy
、各都市でちょうど最も高価な家を保つためにコレクタ:
obList.stream()
.collect(
groupingBy(
x -> x.getCity(),
maxBy(comparing(x -> x.getPrice())))
このリターンMap<CityType, Optional<HouseType>>
(どこCityType
とHouseType
都市や住宅のタイプはそれぞれ、あるものは何でもあります。
あなたがしたい場合Map<CityType, HouseType>
(つまりはなし、であるOptional
あなたは値が常に存在している知っているので、)、下流のコレクターをラップ:
collectingAndThen(maxBy(...), Optional::get)