尽管其他人已经回答了为什么
Math.max不是可变参数的问题,但他们没有回答为什么引入可变参数功能时不会创建这种方法的原因。
我什至不知道(有一个开放的bug报告),所以我只能猜测:
的确没有在中实现它
Math,但是如果我们研究
Collections以下方法:
public static <T extends Object & Comparable<? super T>> T max( Collection<? extends T> coll) { ...}尽管类型签名看起来很丑陋(它必须足够灵活以处理协方差和协方差),但可以轻松地将其与
Collections.max(Arrays.asList(-13,12, 1337, 9));实现所有功能之后一起使用,只是在不同的地方。
更好的是:此方法不仅可以处理double,还可以处理实现
Comparable接口的所有类型。
但是,无论您建议的解决方案还是该解决方案都不
Collections是面向对象的,它们只是静态方法。幸运的是,对于JDK8,这将发生变化:
import java.util.Arrays;import java.util.List;import java.util.Optional;int max(List<Integer> list) { Optional<Integer> opt = list.stream().max((a,b) -> a-b); return opt.orElse(Integer.MAX_VALUE);}max(Arrays.asList(-13, 12, 1337, 9)); // 1337max(Arrays.asList()); // 2147483647对于即将发布的版本,集合库在Project
Lambda中进行了重新设计,使其更加面向对象。在上面的示例中,Lambda用于提供一种简单易读的方式来确定max元素。以下内容也可以工作:
import static java.util.Comparators.naturalOrder;Arrays.asList(-13, 12, 1337, 9) .stream() .max(naturalOrder()) .ifPresent(System.out::println); // 1337
除了
max使用高阶函数外,还可以使用
reduce:
Arrays.asList(-13, 12, 1337, 9) .stream() .reduce((a,b) -> a > b ? a : b) .ifPresent(System.out::println); // 1337
另一个细节是的使用
Optional。由于上面示例中所示的高阶函数的组成,它是一种简化错误处理的类型。
lambda提案具有多个优点,因此无需实现可变形式的Math.max:
- 它是面向对象的
- 它是多态的。这意味着它可以与每一种类型的集合的被使用(
List
,Set
,Stream
,Iterator
等等) - 富有表现力且易于理解
- 它允许即时并行化。只需更改
.stream()
为.parallelStream()



