繁体   English   中英

在嵌套对象上使用 lambda 和流

[英]use of lambda and streams on nested object

我想在复杂的嵌套对象上使用 lambda 和流,并想比较日期。 有人可以帮助我如何使用 lambda 表达式做到这一点

从下面的对象中,我想过滤掉所有权开始日期 < 员工加入日期的所有资产项目 ID,并希望将所有这些 ID 放入一个数组列表

到目前为止,我拥有的代码为我提供了所有资产项目 ID,我不知道如何使用过滤器将 item.ownership.startDate 与 emp.joiningDate 进行比较

{
  "transactionDate": "",
  "employees": [
    {
      "joiningDate": "2018-06-12T07:13:48.504Z",
      "assets": [
        {
          "assetItem": [
            {
              "id": "1",
              "ownership": {
                "startDate": "2017-06-12T07:13:48.506Z",
                "endDate": "2017-06-12T07:13:48.506Z"
              }
            }
          ]
        },
        {
          "assetItem": [
            {
              "id": "2",
              "ownership": {
                "startDate": "2018-06-12T07:13:48.506Z",
                "endDate": "2018-06-12T07:13:48.506Z"
              }
            }
          ]
        },
        {
          "assetItem": [
            {
              "id": "3",
              "ownership": {
                "startDate": "2017-06-12T07:13:48.506Z",
                "endDate": "2017-06-12T07:13:48.506Z"
              }
            }
          ]
        }
      ]
    }
  ]
}

下面是我要修改的代码

  List<String> assetList = object.getEmployees().stream().
            flatMap(emp -> emp.getAssets().stream()).
            flatMap(asset -> asset.getAssetItem().stream()).
            map(item -> item.getId()).collect(Collectors.toList());

期望列表中只有资产项目 id 2。

一种混合方法,对Employee的集合进行for循环迭代,并对每个员工的资产进行流式处理,然后分别根据条件和项目 ID filtermap ping。

List<String> assetItemIds = new ArrayList<>();
for (Employee employee : employees) {
    assetItemIds.addAll(employee.getAssets().stream()
            .flatMap(asset -> asset.getAssetItem().stream())
            .filter(assetItem -> assetItem.getOwnerShip().getStartDate() >= employee.getJoiningDate())
            .map(AssetItem::getId)
            .collect(Collectors.toList()));
}

尽管将其转换为单个流操作的一个稍微复杂的结构是创建EmployeeAssetItem流的条目,过滤操作是技巧,然后相应地映射值。 这可以通过以下方式实现:

List<String> assetItemIds = employees.stream()
        .map(emp -> new AbstractMap.SimpleEntry<>(emp,
                emp.getAssets().stream()
                        .flatMap(asset -> asset.getAssetItem().stream())
                        .filter(assetItem -> assetItem.getOwnerShip().getStartDate() >= emp.getJoiningDate())))
        .flatMap(e -> e.getValue().map(AssetItem::getId))
        .collect(Collectors.toList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM