Java Stream: Comment trouver l'identifiant de json? [dupliquer]

Oct 19 2020

J'ai un json comme ci-dessous et des classes similaires par rapport à lui 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"
            }
        ]
    }
]

J'ai besoin d'une méthode qui reçoit l'uuid et qui retourne id .

Par exemple findClientId("cf89cbc5-0886-48cc-81e7-ca6123bc4967"), puis il retourne 2:

Voici ce que j'ai essayé:

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

Mais il se plaint Non-static method cannot be referenced from a static contextdans la ligne.forEach(Partner::getPartnerId)

Réponses

2 ernest_k Oct 20 2020 at 02:34

Premièrement, Stream.forEachest nul. Vous ne pouvez pas invoquer .filterni aucune autre méthode après. À côté de cela, .map(MyClient::getPartners)vous perdriez des MyClientinformations dans le pipeline pendant MyClient.getIdque vous le souhaitez. Vous devrez utiliser un flux imbriqué pour filtrer sur la liste des partenaires dans chaque client.

Votre code doit être:

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
}