如何使用 Java 流到达 JSON 中的上层元素

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

如何使用 Java 中的流获取具有登录名“peter”和状态“SLEEP”的元素“itemid”的值?我的项目中已经有 Jackson 库和 POJO 类。

[
  {
    "itemid": "bf47",
    "name": "test",
    "workers": [
      {
        "user": {
          "id": "7074",
          "login": "john",
                },
        "status": [
          {
            "name": "WORK"
          }
        ]
      },
      
      {
        "user": {
          "id": "1237",
          "login": "peter",
                  },
        "status": [
          {
            "name": "WORK"
          },
          {
            "name": "SLEEP"
          }
        ]
      }
    ],
 
  },
  {
    "itemid": "ea277",
    "name": "test",
    "workers": [
      {
        "user": {
          "id": "2ce0",
          "login": "robert"
                 },
        "status": [
          {
            "name": "WORK"
          }
        ]
      }
    ],
  
  }
  
]

我尝试了以下方式,但没有成功:

String id =  Arrays.stream(allItemId).flatMap(x->x.getworkers().stream())
                .filter(x->x.getUser().getLogin().equals(peter))
                .flatMap(x->x.getStatus().stream())
                .filter(x->x.getName().equals("SLEEP")).map(x->x.getItemId).findFirst().get();
java json java-stream
2个回答
0
投票
String id = allItemId.stream()
    .filter(item -> item.getWorkers().stream()
            .anyMatch(worker ->
                    "peter".equals(worker.getUser().getLogin()) &&
                    worker.getStatus().stream().anyMatch(status -> "SLEEP".equals(status.getName()))
            )
    )
    .findAny()
    .map(Item::getItemid)
    .orElse(null);

0
投票

展平流会将每个

Item
替换为其
Worker
实例,因此无法检索您需要的
itemid
字段。

您想通过中间操作查阅内部列表

filter

List<Item> res = Arrays.stream(allItemId).
                filter(item -> item.getWorkers().stream().anyMatch(worker -> worker.getUser().getLogin().equals("peter")
                        && worker.getStatus().stream().anyMatch(status -> status.getName().equals("SLEEP"))))
                .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.