简体   繁体   中英

How to create a map with Java stream API using a value outside the stream?

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.

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.

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))); 

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 Map s.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM