Как создать карту с 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);

к сожалению, нет такой операции для произвольных Maps.