Map接口 values()方法定义
Collection<V> values();
HashMap类 values()方法实现
public Collection<V> values() {
Collection<V> vs = values;
if (vs == null) {
vs = new Values();
values = vs;
}
return vs;
}
final class Values extends AbstractCollection<V> {
public final int size() { return size; }
public final void clear() { HashMap.this.clear(); }
public final Iterator<V> iterator() { return new ValueIterator(); }
public final boolean contains(Object o) { return containsValue(o); }
public final Spliterator<V> spliterator() {
return new ValueSpliterator<>(HashMap.this, 0, -1, 0, 0);
}
public final void forEach(Consumer<? super V> action) {
Node<K,V>[] tab;
if (action == null)
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {
int mc = modCount;
for (int i = 0; i < tab.length; ++i) {
for (Node<K,V> e = tab[i]; e != null; e = e.next)
action.accept(e.value);
}
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
}
values 实践
Map<String , List<String>> map1 = new HashMap<>();
List<String> list0 = Arrays.asList("00", "01", "02");
List<String> list1 = Arrays.asList("10", "11", "12");
List<String> list2 = Arrays.asList("20", "21", "22");
map1.put("0", list0);
map1.put("1", list1);
map1.put("2", list2);
System.out.println(map1.values());
Set<String> set = new HashSet<>();
map1.values().forEach(value -> set.addAll(value));
System.out.println(set);
Console:
[[00, 01, 02], [10, 11, 12], [20, 21, 22]]
[00, 11, 22, 01, 12, 02, 20, 10, 21]
总结
map value为List时,values()返回对象为List的Collections,如需去重或者整合为同一List,需单独处理