当前位置: 首页 > 面试题库 >

mapToDouble()对列表求和是否真的必要 Java 8流?

满俊楠
2023-03-14
问题内容

据我所知,List<Double>使用Java 8流求和的方法是:

List<Double> vals = . . . ;
double sum = vals.stream().mapToDouble(Double::doubleValue).sum();

在我mapToDouble(Double::doubleValue)看来,这似乎有些cru琐-只是应该放弃lambda和数据流的样板“仪式”。

最佳实践告诉我们,List实例比数组更可取,但是对于这种求和,数组看起来更干净:

double[] vals = . . . ;
double sum = Arrays.stream(vals).sum();

当然,可以做到这一点:

List<Double> vals = . . . ;
double sum = vals.stream().reduce(0.0, (i,j) -> i+j);

但这reduce(....)比更长sum()

我知道这与需要围绕Java的非对象原语对流进行改造的方式有关,但是,我在这里还缺少什么吗?有什么方法可以压缩自动装箱以使其更短吗?还是这只是当前的最新状态?

更新-答案摘要

以下是答案的摘要。我在这里进行总结时,我敦促读者自己仔细阅读答案。

@dasblinkenlight解释说,由于Java历史中更进一步的决策,特别是在实现泛型的方式及其与非对象基元的关系方面,总是需要某种类型的拆箱操作。他指出,从理论上讲,编译器可以进行拆箱操作并允许使用更简短的代码,但这尚未实现。

@Holger显示了一个非常接近我所要表达的解决方案:

double sum = vals.stream().reduce(0.0, Double::sum);

我没有意识到新的静态Double.sum()方法。加上1.8,似乎是出于我所描述的目的。我还发现了Double.min()Double.max()。展望未来,我一定会将此习语用于类似的操作List<Double>


问题答案:

在我mapToDouble(Double::doubleValue)看来,似乎不需要什么lambda和小溪。

使用的需要mapToDouble是决定通过类型擦除实现泛型的结果,实质上是在使用泛型内部使用基元的任何可能性上都关了门。这是使得有必要创建相同的决定DoubleStreamIntStreamLongStream家庭类-
提供基于流的拆箱。

有什么方法可以压缩自动装箱以使其更短吗?还是这只是当前的最新状态?

不幸的是,目前还没有:尽管从理论上说编译器有可能找出Stream<Double>可以DoubleStream隐式转换为原始类型的方法,但是尚未完成。

就基于阵列的解决方案而言,它是这三种方法中效率最高的。但是,它不如其他两个灵活:一个mapToDouble可以让您对自定义类的任何属性求和,而最后一个可以让您执行其他类型的聚合。

reduce(....) 比这更长 sum()

我同意,这种方法比mapToDouble可读性差。



 类似资料:
  • 当然,我们可以这样做: 但是要比长得多。 我知道这与流需要围绕Java的非对象原语进行修改的方式有关,但是,我在这里是否遗漏了什么?有没有什么方法可以把自动装箱压缩到更短的地方?还是这只是目前的技术水平?

  • 问题内容: 在这里说这是必需的 但是我看到即使我没有指定action属性,表单也会被提交,并且表单也将被提交到当前页面,这正是我想要的。 问题答案: 该要求仅按 标准 。完全有可能在页面上执行任何操作而不遵循标准。如果执行此操作,则可能无法正常显示或工作,但很可能会正确显示或工作。目标是关注它们,其思想是,如果您遵循它们,您的页面将 始终 有效;您不必担心任何事情。 是的,该表单 必须 具有HTM

  • 问题内容: 我的教授和这个家伙都声称创造了价值清单。 “注意:范围函数仅返回包含从x到y-1的数字的列表。例如,range(5,10)返回列表[5、6、7、8、9]。” 我认为这是不准确的,因为: 此外,访问由创建的整数的唯一显而易见的方法是遍历它们,这使我认为标记为列表是不正确的。 问题答案: 在Python 2.x中,返回一个列表,但在Python 3.x中,返回一个不可变序列,类型为。 Py

  • 问题内容: 假设有一个Obj类 并且您有一个实例列表,即。 现在,如何在Java8中使用过滤条件从流中找到列表中的对象的int字段值的总和(例如,对于object ,条件为)? 问题答案: 你可以做 或(使用方法参考)

  • 问题内容: 我有一个带有以下签名的类: 我想要一个来自a 的键,该键将是该类的名称。我如何使用java8流按es名称对列表进行分组?所有es在名称上都是唯一的。 可以在单个流中求解,还是应该以某种方式拆分它还是采用经典解决方案? 问题答案:

  • 问题内容: 我的问题是,此代码是否能证明/否定/否定这样的假设,即在拆解方法中使成员变量无效是有用的?我用JUnit4.8.1测试了它。 JUnit为4个测试中的每一个创建测试类的新实例。每个实例都包含一个对象obj。该obj也作为静态WeakHashMap的键插入。如果并且当JUnit释放其对测试实例的引用时,关联的obj值将被弱引用,因此有资格使用gc。该测试尝试强制使用gc。WeakHash