我有一个Hotel
,每个BigDecimal minSellingPrice
都有Hotel
,我希望以最低售价获得hotels.stream().min((h1, h2) -> h1.getMinSellingPrice().compareTo(h2.getMinSellingPrice())).get()
。
我能够通过此代码
实现这一目标minSellingPrice
但如果列表中的3家酒店有最低卖价,那么该列表有50家酒店,最低minSellingPrice
为100,50家酒店中有3家酒店的map
为100。
如何获得这3家酒店的清单,以便我可以对它们进行操作?我唯一想到的是通过min
和main()
获取最低价格然后查询列表中价格最低的商品,但这听起来不太好。
答案 0 :(得分:3)
你可以在下面尝试获得最小酒店
Hotel min = hotels.stream().min(Comparator.comparing(Hotel::getSellingPrice)).orElse(null);
为了获得多家酒店,您需要使用groupingBy
Map<BigDecimal, List<Hotel>> groupedHoted = hotels.stream().collect(Collectors.groupingBy(Hotel::getSellingPrice, TreeMap::new, Collectors.toList()));
<强>更新强>
根据评论编辑
groupedHoted = new TreeMap<>(hotels.stream().collect(Collectors.groupingBy(Hotel::getSellingPrice)));
使用reduce(少推荐)
Map<BigDecimal, List<Hotel>> sorted = hotels.stream().reduce(new TreeMap<BigDecimal, List<Hotel>>(), (map, hotel) -> {
if (map.get(hotel.getSellingPrice()) == null) {
map.put(hotel.getSellingPrice(), new ArrayList<>());
}
map.get(hotel.getSellingPrice()).add(hotel);
return map;
}, (map1, map2) -> {
map1.putAll(map2);
return map1;
});
输出
{10=[Hotel [sellingPrice=10], Hotel [sellingPrice=10]], 20=[Hotel [sellingPrice=20], Hotel [sellingPrice=20]], 30=[Hotel [sellingPrice=30]]}
答案 1 :(得分:1)
如果您想对酒店列表进行排序:
Brush
这使用比较器documentation here。
或者在列表中返回最低售价:
Comparator<Hotel> comp = new Comparator<Hotel>() {
public int compare(Hotel o1, Hotel o2) {
return o1.getMinSellingPrice() - o2.getMinSellingPrice();
}
};
hotels = hotels.stream().sorted(comp).collect(Collectors.toList());
这只是将酒店列表映射到他们的minSellingPrice列表,然后取最小值。
答案 2 :(得分:1)
使用Collectors.groupingBy()
形式,您可以指定要使用的Map
类型,并指定SortedMap
或NavigableMap
实施。然后,您可以轻松地从结果中检索最小元素的集合。
NavigableMap<BigDecimal, List<Hotel>> hotelByPrice = hotels.stream()
.collect(Collectors.groupingBy(Hotel::getMinSellingPrice, TreeMap::new, Collectors.toList()));
List<Hotel> cheapest = hotelByPrice.firstEntry().getValue();
答案 3 :(得分:0)
另一种可能性。
List<Hotel> minHotels = hotels.stream()
.filter(h -> h.minSellingPrice == hotels.stream()
.map(Hotel::getMinSellingPrice).sorted().findFirst().orElse(null))
.collect(Collectors.toList());