Spring MultiValueMap

  1. public interface MultiValueMap<K, V> extends Map<K, List<V>> {
  2. /**
  3. * 获取value的第一
  4. */
  5. @Nullable
  6. V getFirst(K key);
  7. /**
  8. * 添加元素
  9. */
  10. void add(K key, @Nullable V value);
  11. /**
  12. * 添加所有元素
  13. */
  14. void addAll(K key, List<? extends V> values);
  15. /**
  16. * 添加要给 {@link MultiValueMap} 对象
  17. */
  18. void addAll(MultiValueMap<K, V> values);
  19. default void addIfAbsent(K key, @Nullable V value) {
  20. if (!containsKey(key)) {
  21. add(key, value);
  22. }
  23. }
  24. /**
  25. * 设置数据
  26. */
  27. void set(K key, @Nullable V value);
  28. /**
  29. * 设置一个map数据
  30. */
  31. void setAll(Map<K, V> values);
  32. /**
  33. * 转换成 map 结构
  34. */
  35. Map<K, V> toSingleValueMap();
  36. }
  • 但从接口定义上可以明确 value 是一个 list 结构

类图

Spring MultiValueMap - 图1

LinkedMultiValueMap

  1. public class LinkedMultiValueMap<K, V> implements MultiValueMap<K, V>, Serializable, Cloneable {
  2. @Override
  3. @Nullable
  4. public V getFirst(K key) {
  5. // 获取list
  6. List<V> values = this.targetMap.get(key);
  7. // 获取 list 的第一个
  8. return (values != null && !values.isEmpty() ? values.get(0) : null);
  9. }
  10. @Override
  11. public void add(K key, @Nullable V value) {
  12. // 从当前内存中获取key对应的list.
  13. List<V> values = this.targetMap.computeIfAbsent(key, k -> new LinkedList<>());
  14. // 将value 插入到values中
  15. values.add(value);
  16. }
  17. @Override
  18. public void addAll(K key, List<? extends V> values) {
  19. // 从当前内存中获取key对应的list.
  20. List<V> currentValues = this.targetMap.computeIfAbsent(key, k -> new LinkedList<>());
  21. // 将value 插入到values中
  22. currentValues.addAll(values);
  23. }
  24. @Override
  25. public void addAll(MultiValueMap<K, V> values) {
  26. for (Entry<K, List<V>> entry : values.entrySet()) {
  27. addAll(entry.getKey(), entry.getValue());
  28. }
  29. }
  30. @Override
  31. public void set(K key, @Nullable V value) {
  32. // 构造list
  33. List<V> values = new LinkedList<>();
  34. // 添加
  35. values.add(value);
  36. // 添加
  37. this.targetMap.put(key, values);
  38. }
  39. @Override
  40. public void setAll(Map<K, V> values) {
  41. // 循环执行 set 方法
  42. values.forEach(this::set);
  43. }
  44. @Override
  45. public Map<K, V> toSingleValueMap() {
  46. // 返回结果定义
  47. LinkedHashMap<K, V> singleValueMap = new LinkedHashMap<>(this.targetMap.size());
  48. // 循环
  49. this.targetMap.forEach((key, values) -> {
  50. if (values != null && !values.isEmpty()) {
  51. // value 获取原来list中的第一个元素
  52. singleValueMap.put(key, values.get(0));
  53. }
  54. });
  55. return singleValueMap;
  56. }
  57. }
  • 其他实现类也基本和这个类相同, 不做具体展开