stream.collect(collectors.maxby())可获取集合中按指定属性最大的对象,需传入comparator;属性类型须实现comparable,null值需用nullsfirst/last处理;返回optional,须判空;基本类型推荐comparingint/long/double;支持自定义逻辑和多条件排序。

直接用 Stream.collect(Collectors.maxBy()) 可以获取集合中按指定属性比较后最大的那个对象,关键在于传入一个能比较该属性的 Comparator。
确保属性可比较且非 null
被比较的属性类型必须实现 Comparable(如 Integer、String、LocalDateTime 等),否则会抛 ClassCastException。如果属性可能为 null,需提前处理,否则比较时可能触发 NullPointerException。
- 推荐用
Comparator.nullsLast(Comparator.naturalOrder())容忍 null(null 排在最后) - 或用
Comparator.comparing(obj -> obj.getProperty(), Comparator.nullsFirst(Comparator.naturalOrder()))把 null 排最前
写法示例:找 price 最高的 Product
假设有一个 Product 类,含 name 和 price: BigDecimal:
Optional<product> maxProduct = products.stream()
.collect(Collectors.maxBy(Comparator.comparing(Product::getPrice)));
</product>
注意返回值是 Optional<product></product> —— 若集合为空,结果为 Optional.empty(),务必判空再取值:
-
maxProduct.orElse(null)或maxProduct.orElseThrow() - 避免直接调用
maxProduct.get(),否则空集合时抛NoSuchElementException
处理基本类型或包装类属性
若属性是 int、long、double,可用对应方法避免自动装箱开销:
Comparator.comparingInt(Product::getStock)Comparator.comparingLong(Order::getOrderId)Comparator.comparingDouble(Item::getScore)
这些方法内部不产生中间对象,性能略优,且天然处理 int/long/double 的自然序。
自定义比较逻辑(比如按字符串长度)
不一定要用属性本身的自然序。例如找名字最长的用户:
Optional<user> longestNameUser = users.stream()
.collect(Collectors.maxBy(Comparator.comparing(u -> u.getName().length())));
</user>
也可以链式组合多个条件,比如先按价格降序,价格相同时按名称升序:
Comparator<product> cmp = Comparator.comparing(Product::getPrice).reversed()
.thenComparing(Product::getName);
Optional<product> result = products.stream().collect(Collectors.maxBy(cmp));
</product></product>
不复杂但容易忽略细节:判空、null 安全、返回类型是 Optional。











