Карта коллекции потоков Java

#java #stream #maps

Вопрос:

У меня есть карта, которая содержит в качестве строки ключа и в качестве значения список объектов Names . На этой карте я несколько лет сохранял информацию об Names А. Каждый объект класса ` имеет имя, пол и атрибуты ранга.

 Map <String, ArrayList<Names>> myMap = new TreeMap<>();
 

Я пытался это сделать, но это не работает:

 List<Names> filterList = myMap.filter((k, v) -> v.name == name).collect(Collectors.toList);
 

Ответ №1:

Предполагая, что входная карта выглядит следующим образом:

 Map<String, List<BabyName>> inputMap;
 

Список BabyName должен быть получен с помощью flatMap и filter операций Stream API:

 List<BabyName> result = inputMap.values() // Collection<List<BabyName>>
        .stream() // Stream<List<BabyName>>
        .flatMap(List::stream) // Stream<BabyName>
        .filter(bn -> bn.getRank() == 3) // filtered Stream<BabyName>
        .collect(Collectors.toList());
 

Ответ №2:

Вот как бы я это сделал, не уверен, что я здесь помогаю. Я довольно новичок в Java и программировании в целом.

 //Method that takes an ArrayList, filter the list, and returns a new ArrayList
public static ArrayList<BabyName> filterArrayList(ArrayList<BabyName> inputList, int filter) {
        ArrayList<BabyName> returnList = new ArrayList<>();
        for (BabyName babyName: inputList) {
            if (babyName.getRank() == filter)
                returnList.add(babyName);
        } return returnList;
    }
 

Этот блок кода в основном повторяет древовидную карту и вызывает описанный выше метод. Список массивов, возвращенный вышеуказанным методом, добавляется в новый mFilteredList список массивов .

 ArrayList<BabyName> mFilteredList = new ArrayList<>();

for (Iterator<ArrayList<BabyName>> iterator = myMap.values().iterator(); iterator.hasNext(); ) {
            ArrayList<BabyName> nameList = iterator.next();
            mFilteredList.addAll(filterArrayList(nameList, 2));
        }