Как сгруппировать по значениям свойств из объекта java - PullRequest
0 голосов
/ 18 июня 2020

Предположим, у меня есть объект ниже,

class sample
{
private String type;
private List<String> a1;
private List<String> a2;
private List<String> a3;
}

и значения для класса выше,

 Sample sample1 = new Sample("type1", Arrays.asList("first", "second"), Arrays.asList("first") , [] );
 Sample sample2 = new Sample("type2", Arrays.asList("first", "second"), Arrays.asList("third") , [] );

Я ожидал результата ниже,

first - [ type1, type2 ], second -[ type1, type2 ], third - [ type2 ]

Требование : «Группирование свойств значений a1, a2, a3 и типа карты с другими свойствами»

Пожалуйста, помогите мне решить эту проблему

1 Ответ

2 голосов
/ 18 июня 2020

Сначала объедините каждый список a1, a2 и a3, сопоставив его с Map.entry, где ключ - это строка из списка, а значение - type (используйте distinct, потому что есть случай, когда «первый» появляется как в списке a1 и а2). Затем выполните группировку с помощью Map.Entry.

Sample sample1 = new Sample("type1", Arrays.asList("first", "second"), Arrays.asList("first"), Arrays.asList());
Sample sample2 = new Sample("type2", Arrays.asList("first", "second"), Arrays.asList("third"), Arrays.asList());

List<Sample> samples = Arrays.asList(sample1, sample2);

Map<String, List<String>> samplesMap = samples.stream()
        .flatMap(s -> Stream.of(s.getA1(), s.getA2(), s.getA3())
                .flatMap(l -> l.stream().map(a -> Map.entry(a, s.getType())))
                .distinct()
        )
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
...