Карта фильтрации со списком значений списков

#java

#java

Вопрос:

Я пытаюсь использовать потоки для фильтрации карты. Таким образом, карта имеет вид

<Street,List<Houses>>

где оба Street и Houses являются классами. У House класса есть вызываемое поле color , по которому я хочу выполнить фильтрацию. Итак, в основном я хочу отфильтровать эту карту, чтобы получить карту, которая имеет Street в качестве ключей и House цвета blue в качестве значений, т.е

<Street,List<Houses>> где Houses.color = blue

Есть идеи, как это сделать с потоками?

Ответ №1:

Это хороший вариант использования для Stream , действительно

 map.entrySet()
   .stream()
   .collect(Collectors.toMap(
           Entry::getKey,
           e -> e.getValue() // List<Houses>
                 .stream()
                 .filter(h -> h.getColor() == Color.BLUE)
                 .collect(Collectors.toList())
   ));
  

Трюк, позволяющий сделать Stream поток более читаемым

 map.entrySet()
   .stream()
   .collect(toMap(Entry::getKey, filterBy(Color.BLUE)));
  

И filterBy метод

 Function<Entry<String, List<MyClass>>, List<MyClass>> filterBy(final Color color) {
    return e -> e.getValue()
                 .stream()
                 .filter(s -> s.getColor() == color)
                 .collect(toList());
}