虽然其他人已经回答了为什么Math.max不是可变参数,但他们没有回答为什么在引入可变参数函数时不会创建这样的方法.
我甚至不知道它(有一个open bug-report)所以我只能猜测:
确实,它没有在Math中实现,但如果我们查看集合,则有以下方法:
public static > T max(
Collection extends T> coll) {
...
}
虽然类型签名看起来很丑陋(它需要足够灵活以处理协方差和逆变),但它可以很容易地与Collections.max一起使用(Arrays.asList(-13,12,1337,9));完成所有功能后,只需在不同的地方.
更好的是:此方法不仅可以处理双打,还可以处理实现Comparable接口的所有类型.
尽管如此,既没有建议的解决方案,也没有集合中的解决方案是面向对象的,它们只是静态方法.幸运的是,JDK8会改变:
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
int max(List list) {
Optional opt = list.stream().max((a,b) -> a-b);
return opt.orElse(Integer.MAX_VALUE);
}
max(Arrays.asList(-13, 12, 1337, 9)); // 1337
max(Arrays.asList()); // 2147483647
对于即将发布的版本,集合库在Project Lambda中进行了重新设计,以更加面向对象.在上面的示例中,Lambdas用于提供一种简单易读的方法来确定max元素.以下也可以:
import static java.util.Comparators.naturalOrder;
Arrays.asList(-13, 12, 1337, 9)
.stream()
.max(naturalOrder())
.ifPresent(System.out::println); // 1337
而不是max one也可以使用更高阶函数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()