Как создать карту с API Java stream, используя значение вне потока?
Я хочу init a Map<String, BigDecimal>
и хочу всегда ставить одно и то же BigDecimal
значение извне потока.
BigDecimal samePrice;
Set<String> set;
set.stream().collect(Collectors.toMap(Function.identity(), samePrice));
однако Java жалуется следующим образом:
метод toMap (Function, Function) в коллекторах типов неприменим для Аргументов (Функция, BigDecimal)
Почему я не могу использовать BigDecimal извне? Если я напишу:
set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));
это будет работать, но это конечно не то, чего я хочу.
3 ответов
второй аргумент (как и первый) из toMap(keyMapper, valueMapper)
- это функция, которая принимает элемент stream и возвращает значение карты.
в этом случае вы хотите игнорировать его, чтобы иметь:
set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice));
обратите внимание, что второй попытки не будет работать по той же причине.
Collectors#toMap
ожидает два Functions
set.stream().collect(Collectors.toMap(Function.identity(), x -> samePrice));
вы можете найти почти тот же пример в JavaDoc
Map<Student, Double> studentToGPA students.stream().collect(toMap(Functions.identity(), student -> computeGPA(student)));
как уже говорилось в других ответах, вам нужно указать функцию, которая сопоставляет каждый элемент с фиксированным значением, например element -> samePrice
.
в качестве дополнения, если вы хотите специально заполнить ConcurrentHashMap
, есть аккуратная функция, которая вообще не нуждается в потоковой операции:
ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>();
map.keySet(samePrice).addAll(set);
к сожалению, нет такой операции для произвольных Map
s.