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

筛选并合并带有流的对象列表[重复]

陶琦
2023-03-14

我需要筛选我的对象列表:

"elems": [
    {
      "field1": "aaa",
      "field2": "aaa",
      "field3": "a1",
      "field4": 110
    },
    {
      "field1": "aaa",
      "field2": "aaa",
      "field3": "a2",
      "field4": 120
    },
    {
      "field1": "aaa",
      "field2": "aaa",
      "field3": "a3",
      "field4": 140
    },
    {
      "field1": "bbb",
      "field2": "bbb",
      "field3": "b1",
      "field4": 5
    }
]

以便将具有相同字段1字段2的所有对象合并到具有以下属性的单个对象中:

  • 作为field4所有field4值的和
  • 作为field3所有field3值的字符串级联

所以结果是:

"elems": [
    {
      "field1": "aaa",
      "field2": "aaa",
      "field3": "a1a2a3",
      "field4": 370
    },
    {
      "field1": "bbb",
      "field2": "bbb",
      "field3": "b1",
      "field4": 5
    }
]

Java 8中的溪流有可能做到吗?

我尝试了几种方法(例如,还使用#reduce),但我没有找到解决方案!

谢谢

编辑:

下面是我尝试的:

items.stream().
    map(item -> {
        return items.stream().
                reduce(MyClass::filterAndMerge).
                orElse(item);
    }).
    forEach(item -> {
        // ...
    });

private static Item filterAndMerge(
        final Item item1,
        final Item item2) {

    final Item output = new Item();
    output.setField1(item2.getField1());
    output.setField2(item2.getField2());

    if (item1.getField1().equals(item2.getField1())
            && item1.getField2().equals(item2.getField2())) {

        output.setField3(item1.getField3() + item2.getField3());
        output.setField4(item1.getField4() + item2.getField4());
    }

    return output;
}

但由于某种原因,在计算过程中,我在item1.GetField2().equals(item2.GetField2())上得到了NullPointerException,无论如何,我非常肯定这不是一个有效的解决方案。

共有1个答案

柯国安
2023-03-14

看来您必须首先按字段1字段2对项进行分组,并合并与同一键关联的值。可以按照@naman的建议使用tomap来完成

public static void main(String[] args) {
    List<Item> items = List.of(
        new Item("aaa", "aaa", "a1", 110),
        new Item("aaa", "aaa", "a2", 120),
        new Item("aaa", "aaa", "a3", 140),
        new Item("bbb", "bbb", "b1", 5)
    );

    Collection<Item> values = items.stream()
            .collect(Collectors.toMap(
                    item -> item.getField1() + item.getField2(), 
                    Function.identity(), 
                    Main::mergeToOneItem
            )).values();
}

private static Item mergeToOneItem(Item item1, Item item2) {
    return new Item(
            item1.getField1(),
            item1.getField2(),
            item1.getField3() + item2.getField3(),
            item1.getField4() + item2.getField4()
    );
}
 类似资料:
  • 我有两个可观测值,一个返回1个元素,另一个返回多个元素。我的目标是在不阻塞的情况下将它们合并在一起,以构建如下对象: 我试过压缩、合并和合并,但似乎都不是解决方案。

  • 我正在尝试根据另一个列表中存在的值筛选一个列表。我已经经历了其他类似的问题,并试图利用这些来实现我的目标,但无法做到这一点。 列表1由类(L1)的对象组成 列表2由类(L2)的对象组成 因此,筛选后,列表1将不包含,因为该模型与中的不匹配。 我怎么能这么做?

  • 我有两个具有一对多关系的实体,它们通过复合主键连接在一起。由于Spring Data为oracle数据库生成错误计数不同的查询,我SQL笛卡尔连接的输出,这导致每一行子对象都重复父对象的行。我需要找出基于复合键的不同的父对象,然后在列表中为父对象添加每个子对象,并将其设置为父对象的属性 我能够根据父对象的组合键找到不同的父对象。以下是相关代码 假设我有以下输入 我需要产生以下输出 这方面的任何帮助

  • 我有一个Java类,它有20个属性及其相应的getter和setter。还有两个对象列表:和。 使用Java 8: 但是我必须在哪个地方指定属性呢?是否应该重写和方法?

  • 我有以下情况 我必须合并所有列表从映射的对象。 知道如何使用Java8流API吗?

  • 我试图使用