21

I want to init a Map<String, BigDecimal> and want to always put the same BigDecimal value from outside of the stream.

BigDecimal samePrice;
Set<String> set;

set.stream().collect(Collectors.toMap(Function.identity(), samePrice));

However Java complains as follows:

The method toMap(Function, Function) in the type Collectors is not applicable for the arguments (Function, BigDecimal)

Why can't I use the BigDecimal from outside? If I write:

set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));

it would work, but that's of course not what I want.

0

3 Answers 3

17

The second argument (like the first one) of toMap(keyMapper, valueMapper) is a function that takes the stream element and returns the value of the map.

In this case, you want to ignore it so you can have:

set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice));

Note that your second attempt wouldn't work for the same reason.

Sign up to request clarification or add additional context in comments.

Comments

9

Collectors#toMap expects two Functions

set.stream().collect(Collectors.toMap(Function.identity(), x -> samePrice));

You can find nearly the same example within the JavaDoc

 Map<Student, Double> studentToGPA
     students.stream().collect(toMap(Functions.identity(),
                                     student -> computeGPA(student)));

Comments

7

As already said in the other answers, you need to specify a function which maps each element to the fixed value like element -> samePrice.

As an addition, if you want to specifically fill a ConcurrentHashMap, there is a neat feature that doesn’t need a stream operation at all:

ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>();
map.keySet(samePrice).addAll(set);

Unfortunately, there is no such operation for arbitrary Maps.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.