Уменьшить список объектов в неизменную карту с помощью лямбды - PullRequest
0 голосов
/ 05 октября 2019

У меня есть список Person объекта. У каждого человека есть уникальный идентификатор, но его имя может быть одинаковым.

Person {
    String id,
    String name,
}

Я хочу преобразовать этот массив людей в ImmutableMap<String, ImmutableSet<String>>. Ключом карты должно быть имя пользователя, неизменный набор содержит идентификаторы имени конкретного пользователя.

Я знаю, как это сделать, используя HashMap и HashSet:

for (person : personList) {
    String id = person.id;
    String name = person.name;
    if (!hashMap.containsKey(name)) {
        hashMap.put(name, new HashSet<String>());
    }
    hashMap.get(name).add(id);
}

Я хочучтобы узнать, как это сделать, используя ImmutableMap, ImmutableSet with lambda.

1 Ответ

0 голосов
/ 05 октября 2019

Вот одно из возможных решений.

Сначала сгенерируйте некоторые данные. Три имени и 18 идентификаторов. Поместите их в список.

      Random r = new Random();
      int[] ids = r.ints(1000, 1, 1000).distinct().limit(18).toArray();
      int id = 0;
      List<Person> people = new ArrayList<>();
      for (int i = 0; i < 6; i++) {
         for (String name : List.of("Bob", "Joe", "Mary")) {
            people.add(new Person(name, ids[id++]));
         }
      }

Теперь создайте карту.

  1. Используйте groupingBy, чтобы создать key, указывающий на collection. Ключ - это имя, а коллекция - карта.

  2. collection(a set) содержит ids

      Map<String, Set<Integer>> nameToID =
            Collections.unmodifiableMap(people.stream().collect(
                  Collectors.groupingBy(Person::getName, Collectors.mapping(
                        Person::getID, Collectors.toUnmodifiableSet()))));

Распечатать их.

      nameToID.entrySet().forEach(
            e -> System.out.println(e.getKey() + " -> " + e.getValue()));

   }
}

Вот класс Person с некоторыми дополнительными методами и конструктором.

class Person {
   String name;
   int    id;

   public Person(String name, int id) {
      this.name = name;
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public int getID() {
      return id;
   }

   public String toString() {
      return "(" + name + "," + id + ")";
   }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...