查找包含具有最近“日期”的内部对象的外部对象,其中其“id”是给定值

问题描述 投票:0回答:3

我正在尝试获取

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"
                }
            ]
        }
    ]
}
java java-stream
3个回答
0
投票
  1. 使用 flatMap 将所有对象收集在同一个数组中:

    OutterObject.stream().flatMap(outer -> outer.getInnerObject().stream());

  2. 使用 max() 和 Comparator 来获取较高的值

  3. 将两者结合起来得到类似的东西:

    Optional<Date> maxDate = OutterObject.stream().flatMap(outer -> outer.getInnerObject().stream()).max(Comparator.comparing(InnerObject::getDate));


0
投票

这个问题可以通过以下方法解决:

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()));

如果您看到一些,我愿意改进。


0
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.