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

聚合两个以上的属性Java 8

姜增
2023-03-14

很简单地说,我有

 class Per{
    int a;
    long b;
    double c;
    String d;
}

假设我每个有3000个类型的对象,并收集在列表 per

    null
int totalA = 0; long totalB = 0l; long totalC = 0l;
    for (Per per : pers) {
        if (per.d != null && !per.d.trim().equals("")) {
            totalA += per.a;
            totalB += per.b;
            totalC += someOperation(per.c);
        }
    }

someoperation隐含并不重要,因为它可能是简单的,也可能是复杂的。

如何通过Java8流和lambda表达式实现这一点?

一个可能的答案是这样的

int totalA = 0; long totalB=0l;
     pers.stream().filter(p->{
         if(p == null || p.d == null || p.d.trim().equals(""))
             return false;
         return true;
     }).forEach(per->{
         totalA += per.a;
            totalB += per.b;
     });

注意:我在这里没有进行任何类型的分组,也不能为创建新的或更新提供的对象。


共有1个答案

晏沈义
2023-03-14

编写自己的累加器类和自定义的收集器,那么这是一个简单的任务。

class Accumulator {
  private int a = 0;
  private long b = 0L;
  private double c = 0d;

  public void accumulate(Per p) {
    a += p.a;
    b += p.b;
    c += someOperation(p.c);
  }

  public Accumulator combine(Accumulator acc) {
    a += acc.a;
    b += acc.b;
    c += acc.c;
    return this;
  }
  // getter, hashCode, ...
}
Accumulator result = pers.stream()
    .filter(p -> p != null && p.d != null && !p.d.trim().isEmpty())
    .collect(Collector.of(Accumulator::new, Accumulator::accumulate, Accumulator::combine));
 类似资料:
  • 我有一个表,其中有3个属性作为主键产品:primary key(,,)。 现在我在另一个表中引用这个复合主键 order_details:外键(product_name,product_type,category)引用产品(product_name,product_type,category) 然而,我在控制台中得到一个错误,说缺少括号,我无法添加外键。但是,如果只在引用中添加两个列名(例如:“F

  • 我正在尝试开发一个ElasticSearch聚合查询,它根据嵌套对象中的属性执行结果的组合。 将为索引设置相应的映射。 我需要的查询如下所示: 查询需要按嵌套属性的名称分组,但从根对象的bin属性分组,这似乎在ElasticSearch中引起了一些麻烦。 当尝试进行以下预固化时: 此上下文似乎不允许基于产品对象的根对项目进行装箱。 ManufacturerName中指定的ManufacturerN

  • 我有以下计数查询: 有没有办法使用single aggregation()和嵌套的$group来实现这一点mongodb@3.2? 我知道这是mapReduce()的一个经典用例,但我在这里没有选择,因为$group by parameters()是一个动态生成的属性,因此聚合阶段的构建也是动态的。 预期输出与两个计数查询的结果相同。-

  • 我有两个不同的csv文件,其中包含两个不同实体上的数据,我必须合并两个不同的csv文件,以创建一个基于sql连接类型equijoin和left join的csv文件。 所以我创建了第一个实体作为类名客户,具有属性: 这个类的对象列表如下: 类似地,我创建了具有属性的二阶实体类: 现在,我需要在orderId的基础上合并这两个对象,并生成第三个对象,其结果类具有上述两个类的所有属性。 请建议我使用j

  • 问题内容: 定义:两个集合的笛卡尔积是这些集合的所有可能对的集合,因此{A,B} x {a,b} = {(A,a),(A,b),(B,a ),(B,b)}。 现在,我想将这样的笛卡尔积插入数据库表(每对成一行)。打算在表中使用每对的默认值,因此此时数据库中不存在数据(即两组)。 任何想法如何使用postgresql实现这一目标? 编辑 : 借助Grzegorz Szpetkowski的答案,我能够

  • 问题内容: 我需要能够在运行时合并两个(非常简单的)JavaScript对象。例如,我想: 有没有人为此提供脚本或知道内置的方式来执行此操作?我不需要递归,也不需要合并函数,只需合并平面对象上的方法即可。 问题答案: ECMAScript 2018标准方法 您将使用对象传播: 现在是和的并集。中的属性将覆盖中的属性。 这也是此语法的MDN文档。如果您正在使用babel,则需要babel-plugi