Java 8 lambdas group list into map

51.9k Views Asked by At

I want to take a List<Pojo> and return a Map<String, List<Pojo>> where the Map's key is a String value in Pojo, let's call it String key.

To clarify, given the following:

Pojo 1: Key:a value:1

Pojo 2: Key:a value:2

Pojo 3: Key:b value:3

Pojo 4: Key:b value:4

I want a Map<String, List<Pojo>> with keySet() sized 2, where key "a" has Pojos 1 and 2, and key "b" has pojos 3 and 4.

How could I best achieve this using Java 8 lambdas?

2

There are 2 best solutions below

0
On BEST ANSWER

Use the simple groupingBy variant:

Map<String, List<Pojo>> map = pojos
  .stream()
  .collect(
     Collectors.groupingBy(Pojo::getKey)
  );
0
On

Also, if you wanted to return a similar map but instead of whole Pojo you wanted the map's values be some property of the Pojo, you would do like that:

Map<String, List<String>> map = pojos
  .stream()
  .collect(
    Collectors.groupingBy(
      Employee::getKey,
      Collectors.mapping(
        Pojo::getSomeStringProperty, 
        Collectors.toList()
      )
    )
  );