栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么Math.max(double a,double b)不可变?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Math.max(double a,double b)不可变?

尽管其他人已经回答了为什么

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:

  1. 它是面向对象的
  2. 它是多态的。这意味着它可以与每一种类型的集合的被使用(
    List
    Set
    Stream
    Iterator
    等等)
  3. 富有表现力且易于理解
  4. 它允许即时并行化。只需更改
    .stream()
    .parallelStream()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454849.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号