java double max,java – 为什么不是Math.max(double a,double b)可变参数?

虽然其他人已经回答了为什么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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值