Java 如何从Guava中的列表中获取max()元素

Java 如何从Guava中的列表中获取max()元素,java,guava,Java,Guava,假设我们有一个项目集合: class Item { public String title; public int price; } List<Item> list = getListOfItems(); 我该怎么做?它的效率有多高?排序o=新排序(){ Ordering<Item> o = new Ordering<Item>() { @Override public int compare(Item left, Item

假设我们有一个项目集合:

class Item {
    public String title;
    public int price;
}

List<Item> list = getListOfItems();
我该怎么做?它的效率有多高?

排序o=新排序(){
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.max(列表);

它尽可能地高效:它遍历列表中的项目,并返回第一个具有最高价格的项目:O(n)。

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

Ordering.<Integer> natural().max(listOfIntegers);
订购。natural().max(整数列表);

有关详细信息,请参阅。

不吃番石榴也可以

集合提供对任何集合进行操作的方法,包括使用比较器的重载。在这里,我们使用带有lambda的Java 8 Comparator静态方法来简洁地指定比较器,但在Java 8之前,您可以使用匿名类:

Item max = Collections.max(list, Comparator.comparingInt(i -> i.price));
如果集合为空,这些方法将抛出NoTouchElementException


Java8流提供了使用比较器的函数。这些函数返回
可选
,以优雅地处理空流。比较器中的静态方法有助于简洁地指定比较器,包括自然排序的常见情况。对于这个问题,您可以使用

Optional<Item> max = list.stream().max(Comparator.comparingInt(i -> i.price));
Optional max=list.stream().max(Comparator.comparingit(i->i.price));
这将适用于任何流源,其中包括所有集合实现,以及文件等其他内容,并且通过过滤流可以轻松计算集合子集的最大值。如果您有一个大型集合和一个昂贵的比较器(例如字符串的自然排序),那么可以使用并行流


(旁白:理想情况下,流将提供
min
max
重载,在流类型实现Compariable时不带任何参数。不幸的是,Java不支持基于类型参数有条件地公开方法,仅在这种情况下引入新的StreamOfCompariable接口扩展流是不值得的。)

如果价格不为整数,您是否以番石榴的方式使用此方法?价格类型无关。您只需要提供一个按价格比较商品的订单。假设它是BigDecimal,您可以使用
返回left.price.compareTo(right.price)
Optional<Item> max = list.stream().max(Comparator.comparingInt(i -> i.price));