Saya memiliki daftar data ini

List<Status> statuses = [
    {
        id: 123
        mainSatus: HA
        MoreInfo: {
            name: max
            status: MM
        }
    },
    {
        id: 456
        mainSatus: HA
        MoreInfo: {
            name: max
            status: KK
        }
    },
    {
        id: 777
        mainSatus: OU
        MoreInfo: {
            name: max
            status: KK
        }
    }
];

Saya ingin memiliki output seperti ini

List<SimilarInfo> similarinfos = [{mainStatus:HA, statueses:[MM,KK]} , {mainStatus:OU, statuses:[KK]}];

Jadi pengelompokan berdasarkan mainStatus dengan status yang sesuai.

0
Alex Alex 27 Mei 2021, 12:14

2 jawaban

Jawaban Terbaik

Anda dapat melakukan hal berikut:

List<Status> statuses = Arrays.asList(
        new Status(123, "HA", new MoreInfo("max", "MM")),
        new Status(456, "HA", new MoreInfo("max", "KK")),
        new Status(777, "OU", new MoreInfo("max", "KK"))
);

Map<String, List<String>> mainStatusToStatuses = statuses.stream()
        .collect(Collectors.groupingBy(Status::getMainStatus,
                Collectors.mapping(status -> status.getMoreInfo().getStatus(), Collectors.toList())));

System.out.println(mainStatusToStatuses);

Keluaran:

{OU=[KK], HA=[MM, KK]}

Jika Anda tidak puas dengan peta, Anda dapat melakukannya dari sini:

List<SimilarInfo> similarInfos = mainStatusToStatuses.entrySet().stream()
        .map(entry -> new SimilarInfo(entry.getKey(), entry.getValue()))
        .collect(Collectors.toList());

System.out.println(similarInfos);

Keluaran:

[SimilarInfo(mainStatus=OU, statuses=[KK]), SimilarInfo(mainStatus=HA, statuses=[MM, KK])]
1
Most Needed Rabbit 27 Mei 2021, 10:01

Lihat Kolektor.toMap() atau Kolektor.toConcurrentMap() dengan fungsi penggabungan khusus.

0
Matej 27 Mei 2021, 09:49