package com.foo;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class SomeTest {
@Test
public void test() {
Map<String, Set<String>> movieToActorsName = new HashMap<>();
Set<String> actors = new HashSet<>();
actors.add("Dan");
actors.add("Emma");
movieToActorsName.put("HP", actors);
Map<String, Set<String>> someMap = new HashMap<>();
someMap.put("Movies", new HashSet<>(movieToActorsName.keySet()));
someMap.values().stream().forEach(s -> {
s.add("dummy");
});
someMap = new HashMap<>();
someMap.put("Movies", movieToActorsName.keySet());
someMap.values().stream().forEach(s -> {
s.add("dummy"); // UnsupporrtedOperationException. Because keySet() is immutable.
});
}
}
Keyset is basically just a view of the keys in the map. So If you call remove() on the keyset, it will actually remove the entry for that key in the map.
I found this common where people directly take keySet of a map into a placeholder, which will be modified in the later part of the code. The following is wrong.
placeHolderMap.put(id, referenceMap.keySet());
And this is right.
placeHolderMap.put(id, new HashSet<>(referenceMap.keySet()));
or
placeHolderMap.put(id, referenceMap.keySet().stream().collect(Collectors.toSet()));
No comments:
Post a Comment