Извлечение значения из объекта для Collectors.groupingBy (x, toSet ()) - PullRequest
0 голосов
/ 08 мая 2020

Итак, я пытаюсь создать карту между значением id объекта и набором другого значения внутри этого объекта. Идея состоит в том, что объекты с каждым идентификатором имеют несколько связанных типов, и мне нужно создать способ легко ссылаться на типы, связанные с идентификатором в данном наборе данных.

Например;

public class exampleObj {
    public string id;
    public string type

    // getters and setters are supplied by lombok
}

Map<String, Set<String>> output = listOfExampleObj.stream().........

Результат, который я ищу, - это Map<String, Set<String>> с ключом, являющимся идентификатором, а значением, являющимся набором типа переменной, добавляемым к набору, когда поток повторяется по каждому exampleObj

Я безуспешно пробовал следующее:

Map<String, Set<String>> typeMap = listOfExampleObjs.stream().collect(Collectors.groupingBy(p -> p.getId(), toSet(p.getType)));

Map<String, Set<String>> typeMap = listOfExampleObjs.stream().collect(Collectors.groupingBy(exampleObj::id, toSet(example::type)));

Map<String, Set<String>> typeMap = listOfExampleObjs.stream().collect(Collectors.groupingBy(exampleObj::id, groupingBy(exampleObj::type)));

Есть ли сборщик java, который мне не хватает? Должен ли я делать собственный сборщик, чтобы это произошло?

1 Ответ

1 голос
/ 08 мая 2020

Ниже приведен код ответа:


ExampleObj a = new ExampleObj("1", "a");
ExampleObj b = new ExampleObj("1", "b");
ExampleObj c = new ExampleObj("2", "a");
ExampleObj d = new ExampleObj("2", "b");
ExampleObj e = new ExampleObj("3", "c");
List<ExampleObj> exps = Arrays.asList(a,b,c,d,e);
Map<String, Set<String>> typeMap = exps.stream().collect(Collectors
                            .groupingBy(ExampleObj::getId, 
                                  Collectors.mapping(ExampleObj::getType,  
                                               Collectors.toSet())));  //groupby + mapping

System.out.println(typeMap); // {1=[a, b], 2=[a, b], 3=[c]}


...