我正在尝试获取
id
的 OutterObject
,其中 InnerObject
id
是特定值,而 date
是所有 InnerObject
中所有 OutterObject
中最新的。
我正在尝试通过流来实现这一点。
搜索
id
“ab”,它应该返回“def”,给出以下结构的 JSON 示例。
{
"OutterObject": [
{
"id": "abc",
"InnerObject": [
{
"id": "ab",
"date": "1"
},
{
"id": "de",
"date": "2"
},
{
"id": "ab",
"date": "3"
}
]
},
{
"id": "def",
"InnerObject": [
{
"id": "ab",
"date": "9"
},
{
"id": "de",
"date": "3"
},
{
"id": "ab",
"date": "1"
}
]
}
]
}
使用 flatMap 将所有对象收集在同一个数组中:
OutterObject.stream().flatMap(outer -> outer.getInnerObject().stream());
使用 max() 和 Comparator 来获取较高的值
将两者结合起来得到类似的东西:
Optional<Date> maxDate = OutterObject.stream().flatMap(outer -> outer.getInnerObject().stream()).max(Comparator.comparing(InnerObject::getDate));
这个问题可以通过以下方法解决:
Optional<SimpleImmutableEntry<String, InnerObject>> mostRecentOutterObjectId= MasterObject.getOutter().stream()
.flatMap(outter-> outter.getInner().stream()
.map(inner-> new SimpleImmutableEntry<String, InnerObject>(outter.getId(), inner)))
.filter(outterMap-> StringUtils.equals(outterMap.getValue().getId(), "ab"))
.max((innerA,innerB) -> innerA.getValue().getDate().compareTo(innerB.getValue().getDate()));
如果您看到一些,我愿意改进。
String id = "ab";
Comparator<OutterObject> maxByIdDate =
Comparator.comparing(o -> o.getInnerObject().stream()
.filter(i -> id.equals(i.getId()))
.findFirst()
.orElseThrow()
.getDate());
return masterObject.getOutterObject().stream()
.max(maxByIdDate)
.orElseThrow()
.getId();
这将返回
OutterObject
值,其中 InnerObject
具有最大 date
值,其中 id == "ab"
。然后返回该 id
的 OutterObject
值。
这假设至少有一个
OutterObject
值,并且所有 OutterObject
值都有一个 InnerObject
值,其中 id
为“ab”。如果此假设不成立,则会抛出 NoSuchElementException
。