举个例子,有一个汽车对象,并根据模型(group by)找到了最小和最大价格值。
List<Car> carsDetails = UserDB.getCarsDetails();
Map<String, DoubleSummaryStatistics> collect4 = carsDetails.stream()
.collect(Collectors.groupingBy(Car::getMake, Collectors.summarizingDouble(Car::getPrice)));
collect4.entrySet().forEach(e->System.out.println(e.getKey()+" "+e.getValue().getMax()+" "+e.getValue().getMin()));
output :
Lexus 94837.79 17569.59
Subaru 96583.25 8498.41
Chevrolet 99892.59 6861.85
但是我找不到哪些汽车对象有最大和最小价格。我该怎么做呢?
4条答案
按热度按时间y4ekin9u1#
如果你只对每组中的一个
Car
感兴趣,你可以使用,例如。但是既然你想要最贵的和最便宜的,你需要这样的东西:
由于没有与
DoubleSummaryStatistics
等效的通用统计对象,这种解决方案有点不方便。如果这种情况不止一次发生,值得用这样的类来填补差距:在将其添加到代码库后,您可以像
如果
getPrice
返回double
,则使用Comparator.comparingDouble(Car::getPrice)
而不是Comparator.comparing(Car::getPrice)
可能更有效。fiei3ece2#
这里有一个非常简洁的解决方案。它将所有的
Car
集合到一个SortedSet
中,因此不需要任何额外的类。一个可能的缺点是性能,因为所有的
Car
都被收集,而不仅仅是当前的最小值和最大值。但是除非数据集非常大,否则我不认为它会被注意到。mkh04yzy3#
我想提出一个解决方案,(在我看来)争取最大的可读性(这减少了例如,这种代码的维护负担)。
它是基于
Collector
的,所以作为奖励,它可以与并行Stream
一起使用。结果持有者类值类:
使用方法:
dohp0rv54#
**对于汽车及其最高价格:**Map〈String,Optional〉groupByMaxPrice =carsDetails.stream().collect(Collectors.groupingBy(Car::getMake,Collectors.maxBy(Comparator.comparing(Car::getPrice)));
**对于汽车及其最低价格:**Map〈String,Optional〉groupByMaxPrice =carsDetails.stream().collect(Collectors.groupingBy(Car::getMake,Collectors.maxBy(Comparator.comparing(Car::getPrice)));