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

对对象流中的每个字段求和

金晨
2023-03-14

我想创建对象MyObject的实例,其中的每个字段都是该字段值的总和

我创建一个对象

       public class MyObject{
           int value;
           double length;
           float temperature;

           MyObject(int value, double length, float temperature){
               this.value = value;
               this.length = length
               this.temperature = temperature
           }
        }

然后我构建对象列表:

    List<MyObject> list = new ArrayList<MyObject>{{
          add(new MyObject(1, 1d, 1.0f));
          add(new MyObject(2, 2d, 2.0f));
          add(new MyObject(3, 3d, 3.0f));
    }}

我想要创建对象(new MyObject(6,6d,6f)

很容易对每个流求和一个字段:

Integer totalValue = myObjects.parallelStream().mapToInt(myObject -> myObject.getValue()).sum(); //returns 6;

Double totalLength = myObjects.parallelStream().mapToDouble(MyObject::getLength).sum(); //returns 6d

然后构造对象新的MyObject(总值、总长度、总温度)

但我能把一个流中的所有字段相加吗?我想让stream回来

new MyObject(6, 6d, 6.0f)

共有3个答案

韦繁
2023-03-14

你可以试试下面这样的

MyObject me = new MyObject(
    list.stream().mapToInt(MyObject::getValue).sum(),
    list.stream().mapToDouble(MyObject::getLength).sum(),
    (float)list.stream().mapToDouble(MyObject::getTemperature).sum());

这会满足你的需要。你也可以使用Stream。减少做同样的事情。

贝浩歌
2023-03-14

它是reduce方法的直接应用:

Stream.of(new MyObject(1, 1d, 1.0f), new MyObject(2, 2d, 2.0f), new MyObject(3, 3d, 3.0f)).
                reduce((a, b) -> new MyObject(a.value + b.value, a.length + b.length, a.temperature + b.temperature))
牧宁
2023-03-14

其他解决方案是有效的,但它们都会产生不必要的开销;一个是通过多次复制MyObject,另一个是通过多次流式传输集合。如果MyObject是可变的,理想的解决方案是使用collect()进行可变的缩减:

// This is used as both the accumulator and combiner,
// since MyObject is both the element type and result type
BiConsumer<MyObject, MyObject> reducer = (o1, o2) -> {
    o1.setValue(o1.getValue() + o2.getValue());
    o1.setLength(o1.getLength() + o2.getLength());
    o1.setTemperature(o1.getTemperature() + o2.getTemperature());
}
MyObject totals = list.stream()
        .collect(() -> new MyObject(0, 0d, 0f), reducer, reducer);

这个解决方案只创建一个额外的MyObject实例,并且只迭代列表一次。

 类似资料:
  • 我有这样的想法: 我怎么能把它写在一个流中呢?收集f.e.

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

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

  • 本文向大家介绍PowerShell 每个对象,包括了PowerShell 每个对象的使用技巧和注意事项,需要的朋友参考一下 示例 该ForEach-Objectcmdlet的工作原理类似于该foreach语句,但从管道中获取其输入。 基本用法 例: Foreach-Object有两个默认别名,foreach和%(简写语法)。最常见的是%因为foreach可以与foreach语句混淆。例子: 高级用

  • 问题内容: 假设我有一个这样的Json对象: 为了帮助我阅读它,我将Jackson的Object Mapper与以下类一起使用: 我的问题是,(使用最简单的解释)对象映射器如何“反序列化” Json对象?我以为它与变量名匹配,但是将它们更改几个字母不会影响输出。然后,我尝试切换set()函数的顺序,但没有做任何事情。我也尝试过两者,但这也没用。我猜这里还有一些更复杂的东西,但是呢? 我试图查看文档

  • 我试图实现列表中对象值的累积和。 对象如下所示: 我有一份清单 结果也应该是一个列表 如何使用Java流API实现它? 输入示例为: 所需输出为: