Как создать карту с 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 не существует.