如何使用 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();
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);
展平流会将每个
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());