2015-11-09 2 views
2

У меня есть HashMap, которые мне нужно фильтровать с помощью некоторой функции:Collect поток в HashMap с лямбда в Java 8

HashMap<Set<Integer>, Double> container 
Map.Entry<Set<Integer>, Double> map = container.entrySet() 
      .stream() 
      .filter(k -> k.getKey().size() == size) 

Для размера = 2 должно быть справедливо следующее:

containerBeforeFilter = {1,2,3} -> 1.5, {1,2} -> 1.3 
containerAfterFilter = {1,2} -> 1.3 

После того, как я применил функцию в фильтре, я хочу снова собрать результаты в HashMap. Однако, когда я пытаюсь применить предложенный метод here, я получаю незаконные утверждения.

Так следующее утверждение, применяется после фильтра, является незаконным:

.collect(Collectors.toMap((entry) -> entry.getKey(), (entry) -> entry.getValue())); 

Что бы правильный способ сбора значений без изменений на карте, где единственным критерием является удовлетворение какой-то ключ?

UPDATE

Ошибка в коде выше тип переменной map. Это должно быть Map, а не Map.Entry.

Так функциональный код:

Map<Set<Integer>, Double> map = container.entrySet() 
      .stream() 
      .filter(k -> k.getKey().size() == size) 
      .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue())); 
+0

Вы можете разместить какую версию Java вы используете? Я не могу воспроизвести вашу проблему. – Flown

+0

Это последний JDK 8u65 – chao

+0

Я также использую последний JDK, и это не сработает для вас: «Карта , Double> collect = container.entrySet(). Stream(). Filter (k -> k.getKey() .size() == size) .collect (Collectors.toMap (Entry :: getKey, Entry :: getValue)); ' – Flown

ответ

2

Кажется, что Collectors.toMap не принимает аргументы типа stream.collect в вашем примере и возвращает Map<Object,Object>.

В качестве временного решения вы можете создать результат сопоставления себя и в последнем шаге потока добавить отфильтрованные записи в результирующей карту:

Map<Set<Integer>, Double> result = new HashMap<>(); 
container.entrySet() 
    .stream() 
    .filter(entry -> entry.getKey().size() == size) 
    .forEach(entry -> result.put(entry.getKey(), entry.getValue())); 
+0

Да, этот подход работает хорошо! Хотя, странно, почему другой подход терпит неудачу. Благодаря! – chao

2

Ваш подход является правильным.

Вы только что написали знак «->». Он должен быть без пробела между «-» и «>».

+1

Фактически, я допустил эту ошибку, когда писал письмо. У моего кода такой ошибки нет. Таким образом, вся ошибка такова: ошибка: несовместимые типы: переменная вывода R имеет несовместимые границы .collect (Collectors.toMap ((entry) -> entry.getKey(), (entry) -> entry.getValue())) ; ограничения равенства: Карта , Двойные> верхние оценки: Входные , Двойной>, Объект , где R, А, Т имеют тип-переменные: R расширяет объект, объявленный в методе сбора (коллектор <супер-Т? , A, R>) A extends Объект, объявленный в методе collect (Collector ) – chao

Смежные вопросы