我需要筛选我的对象列表:
"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
和字段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吗?
我试图使用