I created the following method that adds the given UUID value with the given Integer to teh map variable.
final Map<Integer, List<UUID>> map = new TreeMap<>();
private void addToMap(Integer key, UUID value) {
map.computeIfAbsent(key, val -> new ArrayList<>()).add(value);
}
Normally I was tried to use map.computeIfAbsent(key, value -> new ArrayList<>()).add(value); by passing value parameter to the lambda function, it it throws "Variable 'value' is already defined in the scope" error pointing the "value" in .. value -> ... part.
My updated addToMap method is working, but I think val is pointless. So, how should this method be updated?
CodePudding user response:
Your addToMap() method implies a wrong understanding of the parameters of the computeIfAbsent() method:
private void addToMap(Integer key, UUID value) {
map.computeIfAbsent(key, val -> new ArrayList<>()).add(value);
}
The parameter in val -> new ArrayList<>() has nothing to do with the value that you pass into addToMap()!
If you look at the JavaDoc for Map.computeIfAbsent() you can see that the second parameter is a Function<? super K,? extends V> - i.e. a function that takes a key and returns whatever should be stored in the map.
It would be better to write the addToMap() method as
private void addToMap(Integer key, UUID value) {
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}
Note that the answer from toniedzwiedz is dangerous. It only works for a Map<Integer, ?> with keys greater than or equal to zero.
It is dangerous because it basically replaces k -> new ArrayList<>() with k -> new ArrayList<>(k) - this happens to work for maps with Integer keys and uses the key value to define the initial capacity of the ArrayList.
It will not work if k is negative (new ArrayList<>(k) will throw an IllegalArgumentException if k is negative).
It will also not work for a Map<String, UUID> because there is no ArrayList constructor that takes a String argument.
