Java 8 Lambda, фильтр HashMap, не может разрешить метод

Я новичок в новых функциях Java 8. Я изучаю, как фильтровать карту по элементам. Я рассмотрел этот учебник и этот пост для моей проблемы, но я не может решить.

@Test
public void testSomething() throws Exception {
    HashMap<String, Integer> map = new HashMap<>();
    map.put("1", 1);
    map.put("2", 2);
    map = map.entrySet()
            .parallelStream()
            .filter(e -> e.getValue()>1)
            .collect(Collectors.toMap(e->e.getKey(), e->e.getValue()));
}

Однако, моя IDE (IntelliJ) говорит: "Невозможно разрешить метод getKey()", что не может усложнить: enter image description here

Также это не помогает: enter image description here
Может ли кто-нибудь помочь мне решить эту проблему? Благодарю.

Ответ 1

Сообщение вводит в заблуждение, но ваш код не компилируется по другой причине: collect возвращает Map<String, Integer> не a HashMap.

Если вы используете

Map<String, Integer> map = new HashMap<>();

он должен работать как ожидалось (также убедитесь, что у вас есть все соответствующие импорты).

Ответ 2

Вы возвращаете Map not hashMap, поэтому вам нужно изменить тип map на java.util.Map. Кроме того, вы можете использовать ссылку на метод, а не вызов getKey, getValue. Например.

Map<String, Integer> map = new HashMap<>();
        map.put("1", 1);
        map.put("2", 2);
        map = map.entrySet()
                .parallelStream()
                .filter(e -> e.getValue() > 1)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Вы можете решить эту проблему, используя некоторую полезную помощь, например. если вы нажмете ctrl+alt+v перед

new HashMap<>();
            map.put("1", 1);
            map.put("2", 2);
            map = map.entrySet()
                    .parallelStream()
                    .filter(e -> e.getValue() > 1)
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Переменная, созданная intellij, будет точного типа, и вы получите.

Map<String, Integer> collect = map.entrySet()
        .parallelStream()
        .filter(e -> e.getValue() > 1)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));