Java Stream: как найти идентификатор из json? [дубликат]
У меня есть json, как показано ниже, и аналогичные классы относительно него MyClient:
[
{
"id": 2,
"partners": [
{
"configuration": {
"connect-fleet-sync": false
},
"id": "cf89cbc5-0886-48cc-81e7-ca6123bc4857"
},
{
"configuration": {
"connect-fleet-sync": false
},
"id": "cf89cbc5-0886-48cc-81e7-ca6123bc4967"
}
]
},
{
"id": 3,
"partners": [
{
"configuration": {
"connect-fleet-sync": false
},
"id": "c3354af5-16e3-4713-b1f5-a5369c0b13d6"
}
]
}
]
Мне нужен метод, который получает uuid и возвращает id .
Пример Fr, findClientId("cf89cbc5-0886-48cc-81e7-ca6123bc4967")а затем он возвращает 2:
Вот что я пробовал:
public static void findClientId(String partnerId, MyClient[] allMyClients) {
Stream.of(allMyClients)
.map(MyClient::getPartners)
.forEach(Partner::getPartnerId)
.filter(
partner ->partner.id.equals(partnerId)))
.map(MyClient::getId);
}
Но он жалуется Non-static method cannot be referenced from a static contextна линию.forEach(Partner::getPartnerId)
Ответы
Во-первых, Stream.forEachнедействительно. .filterПосле него нельзя вызывать или какой-либо другой метод. Кроме того, это .map(MyClient::getPartners)приведет к потере MyClientинформации в конвейере, пока MyClient.getIdвы этого хотите. Вам нужно будет использовать вложенный поток для фильтрации по списку партнеров в каждом клиенте.
Ваш код должен быть:
public static String findClientId(String partnerId, MyClient[] allMyClients) {
return Stream.of(allMyClients)
.filter(client -> client.getPartners()
.stream()
.anyMatch(partner -> partner.getPartnerId().equals(partnerId)))
.map(MyClient::getId)
.findAny()
.orElse(null); // change to whatever is desired
}