#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());
}