当前位置: 首页 > 知识库问答 >
问题:

mapToDouble()对于用Java8流求和列表真的有必要吗?

况喜
2023-03-14
List<Double> vals = . . . ;
double sum = vals.stream().mapToDouble(Double::doubleValue).sum();
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的非对象原语进行修改的方式有关,但是,我在这里是否遗漏了什么?有没有什么方法可以把自动装箱压缩到更短的地方?还是这只是目前的技术水平?

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

共有1个答案

张建华
2023-03-14

对我来说,maptoDouble(Double::DoubleValue)似乎是lambdas和streams应该省去的东西。

使用maptodouble的需要是通过类型擦除实现泛型的决定的结果,基本上关闭了在泛型中使用基元的任何可能性。正是这个决定使得创建DoubleStreamIntStreamLongStream类家族成为必要,以提供基于流的解装箱。

有没有什么方法可以把自动装箱压缩到更短的地方?还是这只是目前的技术水平?

就基于数组的解决方案而言,它是三种方案中效率最高的。但是,它不如其他两个灵活:带有maptodouble的一个允许您对自定义类的任何属性求和,而最后一个允许您执行其他类型的聚合。

reduce(...)sum()长得多

我同意,这种方法在可读性方面比maptodouble差。

 类似资料:
  • 问题内容: 据我所知,使用Java 8流求和的方法是: 在我看来,这似乎有些cru琐-只是应该放弃lambda和数据流的样板“仪式”。 最佳实践告诉我们,实例比数组更可取,但是对于这种求和,数组看起来更干净: 当然,可以做到这一点: 但这比更长。 我知道这与需要围绕Java的非对象原语对流进行改造的方式有关,但是,我在这里还缺少什么吗?有什么方法可以压缩自动装箱以使其更短吗?还是这只是当前的最新状

  • 问题内容: 我应该在样式表中使用以下哪项? W3C指定什么是 正确的方法 ? 问题答案: W3C表示引号是可选的,您使用的所有三种方式都是合法的。 开头和结尾的引号只需是相同的字符。 如果您的URL中包含特殊字符,则应使用引号或转义字符(请参见下文)。 URI值的格式为’url(’,后跟可选的空格,后跟可选的单引号(’)或双引号(“)字符,然后是URI本身,然后是可选的单引号(’)或双引号(“)字

  • 我正在尝试对List的字段求和并返回值。我想为此使用流,但我对流不熟悉,不确定流是否可以完成此操作。这是我尝试过的,但我认为语法不正确。 上下文的相关类结构。 获取总价和单价方法

  • 问题内容: 我有一个对象A的列表。此列表中的每个对象A都包含对象B的列表,而对象B包含对象C的列表。对象C包含一个属性名称,我想使用它使用Java 8进行过滤。 如何使用流在Java 8中编写以下代码以避免嵌套循环: 问题答案: 您可以使用两个,然后使用a,然后可以选择第一个,或者如果没有结果返回:

  • 我有一个对象列表A。此列表中的每个对象A都包含对象B的列表,对象B包含对象C的列表。对象C包含一个属性名称,我想使用java 8进行过滤。 如何使用流在java8中编写下面的代码以避免嵌套循环:

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