如何从Guava的List中获取max()元素

比方说,我们有一个项目集合:

class Item { public String title; public int price; } List<Item> list = getListOfItems(); 

我想用番石榴图书馆( 订购 ,我想)获得一个最高价格的项目。 我的意思是类似于这个Groovy代码:

 list.max{it.price} 

我怎么做? 它有多高效?

 Ordering<Item> o = new Ordering<Item>() { @Override public int compare(Item left, Item right) { return Ints.compare(left.price, right.price); } }; return o.max(list); 

它的效率如下:迭代遍历列表中的项目,并返回具有最高价格的项目中的第一个:O(n)。

根据JB的回答,当处理有自然顺序的值时,也可以使用一些速记,例如:

 Ordering.<Integer> natural().max(listOfIntegers); 

有关详细信息,请参阅Ordering.natural() 。

你可以做到这一点,没有番石榴。

集合提供在任何Collection上运行的minmax方法,包括采用比较器的超载。 在这里,我们使用Java 8 Comparator静态方法和lambda来简明地指定一个比较器,但在Java 8之前,您可以使用匿名类:

 Item max = Collections.max(list, Comparator.comparingInt(i -> i.price)); 

如果集合为空,这些方法将抛出NoSuchElementException。


Java 8stream提供采用比较器的minmax函数。 这些函数返回Optional<T>来优雅地处理空的stream。 比较器中的静态方法可用于简明地指定比较器,包括自然sorting的常见情况。 对于这个问题,你会使用

 Optional<Item> max = list.stream().max(Comparator.comparingInt(i -> i.price)); 

这将适用于任何stream源,其中包括所有的集合实现,以及其他的东西,如文件,并可以很容易地通过过滤stream来计算集合的子集的最大值。 如果你有一个大集合和一个昂贵的比较器(例如,string的自然顺序),你可以使用一个并行stream。

(除此之外:理想情况下,当streamtypes实现Comparable时,Stream将提供minmax重载,而不支持参数。不幸的是,Java不支持基于types参数有条件地公开方法,而且不值得引入一个新的StreamOfComparable接口来扩展Stream对于这种情况)。