Java Stream: Làm thế nào để tìm id từ json? [bản sao]

Oct 19 2020

Tôi có một json như bên dưới và các lớp tương tự đối với nó 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"
            }
        ]
    }
]

Tôi cần một phương thức nhận uuid và nó trả về id .

Ví dụ Fr findClientId("cf89cbc5-0886-48cc-81e7-ca6123bc4967")và sau đó nó trả về 2:

Đây là những gì tôi đã thử:

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

Nhưng nó phàn nàn Non-static method cannot be referenced from a static contexttrong dòng.forEach(Partner::getPartnerId)

Trả lời

2 ernest_k Oct 20 2020 at 02:34

Đầu tiên, Stream.forEachlà vô hiệu. Bạn không thể gọi .filterhoặc bất kỳ phương thức nào khác sau nó. Bên cạnh đó, .map(MyClient::getPartners)sẽ làm cho bạn mất MyClientthông tin trong đường dẫn trong khi MyClient.getIdbạn muốn. Bạn sẽ phải sử dụng một luồng lồng nhau để lọc danh sách đối tác trong mỗi khách hàng.

Mã của bạn phải là:

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
}