Как создать карту с API потока Java, используя значение за пределами потока?
Я хочу инициализировать Map<String, BigDecimal>
и хочу всегда ставить одно и то же значение BigDecimal
извне потока.
BigDecimal samePrice;
Set<String> set;
set.stream().collect(Collectors.toMap(Function.identity(), samePrice));
Однако Java жалуется следующим образом:
Метод toMap (Function, Function) в классе Collectors неприменим для аргументов (Функция, BigDecimal)
Почему я не могу использовать BigDecimal извне? Если я пишу:
et.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));
это сработало бы, но это, конечно, не то, что я хочу.
Ответы
Ответ 1
Второй аргумент (например, первый) toMap(keyMapper, valueMapper)
- это функция, которая берет элемент потока и возвращает значение карты.
В этом случае вы хотите игнорировать его, чтобы вы могли:
set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice));
Обратите внимание, что ваша вторая попытка не будет работать по той же причине.
Ответ 2
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)));
Ответ 3
Как уже говорилось в других ответах, вам нужно указать функцию, которая сопоставляет каждому элементу фиксированное значение, например element -> samePrice
.
В качестве дополнения, если вы хотите специально заполнить ConcurrentHashMap
, есть аккуратная функция, которая вообще не требует операции потока:
ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>();
map.keySet(samePrice).addAll(set);
К сожалению, такой операции для произвольной Map
s не существует.