|
1 | 1 | /*
|
2 |
| - * Copyright 2002-2019 the original author or authors. |
| 2 | + * Copyright 2002-2020 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
16 | 16 |
|
17 | 17 | package org.springframework.util;
|
18 | 18 |
|
19 |
| -import java.io.Serializable; |
20 | 19 | import java.util.ArrayList;
|
21 | 20 | import java.util.Arrays;
|
22 | 21 | import java.util.Collection;
|
23 | 22 | import java.util.Collections;
|
24 | 23 | import java.util.Enumeration;
|
25 | 24 | import java.util.Iterator;
|
26 | 25 | import java.util.LinkedHashMap;
|
27 |
| -import java.util.LinkedList; |
28 | 26 | import java.util.List;
|
29 | 27 | import java.util.Map;
|
30 | 28 | import java.util.Properties;
|
@@ -379,25 +377,28 @@ public static <E> Iterator<E> toIterator(@Nullable Enumeration<E> enumeration) {
|
379 | 377 |
|
380 | 378 | /**
|
381 | 379 | * Adapt a {@code Map<K, List<V>>} to an {@code MultiValueMap<K, V>}.
|
382 |
| - * @param map the original map |
383 |
| - * @return the multi-value map |
| 380 | + * @param targetMap the original map |
| 381 | + * @return the adapted multi-value map (wrapping the original map) |
384 | 382 | * @since 3.1
|
385 | 383 | */
|
386 |
| - public static <K, V> MultiValueMap<K, V> toMultiValueMap(Map<K, List<V>> map) { |
387 |
| - return new MultiValueMapAdapter<>(map); |
| 384 | + public static <K, V> MultiValueMap<K, V> toMultiValueMap(Map<K, List<V>> targetMap) { |
| 385 | + Assert.notNull(targetMap, "'targetMap' must not be null"); |
| 386 | + return new MultiValueMapAdapter<>(targetMap); |
388 | 387 | }
|
389 | 388 |
|
390 | 389 | /**
|
391 | 390 | * Return an unmodifiable view of the specified multi-value map.
|
392 |
| - * @param map the map for which an unmodifiable view is to be returned. |
393 |
| - * @return an unmodifiable view of the specified multi-value map. |
| 391 | + * @param targetMap the map for which an unmodifiable view is to be returned. |
| 392 | + * @return an unmodifiable view of the specified multi-value map |
394 | 393 | * @since 3.1
|
395 | 394 | */
|
396 | 395 | @SuppressWarnings("unchecked")
|
397 |
| - public static <K, V> MultiValueMap<K, V> unmodifiableMultiValueMap(MultiValueMap<? extends K, ? extends V> map) { |
398 |
| - Assert.notNull(map, "'map' must not be null"); |
399 |
| - Map<K, List<V>> result = new LinkedHashMap<>(map.size()); |
400 |
| - map.forEach((key, value) -> { |
| 396 | + public static <K, V> MultiValueMap<K, V> unmodifiableMultiValueMap( |
| 397 | + MultiValueMap<? extends K, ? extends V> targetMap) { |
| 398 | + |
| 399 | + Assert.notNull(targetMap, "'targetMap' must not be null"); |
| 400 | + Map<K, List<V>> result = new LinkedHashMap<>(targetMap.size()); |
| 401 | + targetMap.forEach((key, value) -> { |
401 | 402 | List<? extends V> values = Collections.unmodifiableList(value);
|
402 | 403 | result.put(key, (List<V>) values);
|
403 | 404 | });
|
@@ -434,141 +435,4 @@ public void remove() throws UnsupportedOperationException {
|
434 | 435 | }
|
435 | 436 |
|
436 | 437 |
|
437 |
| - /** |
438 |
| - * Adapts a Map to the MultiValueMap contract. |
439 |
| - */ |
440 |
| - @SuppressWarnings("serial") |
441 |
| - private static class MultiValueMapAdapter<K, V> implements MultiValueMap<K, V>, Serializable { |
442 |
| - |
443 |
| - private final Map<K, List<V>> map; |
444 |
| - |
445 |
| - public MultiValueMapAdapter(Map<K, List<V>> map) { |
446 |
| - Assert.notNull(map, "'map' must not be null"); |
447 |
| - this.map = map; |
448 |
| - } |
449 |
| - |
450 |
| - @Override |
451 |
| - @Nullable |
452 |
| - public V getFirst(K key) { |
453 |
| - List<V> values = this.map.get(key); |
454 |
| - return (values != null ? values.get(0) : null); |
455 |
| - } |
456 |
| - |
457 |
| - @Override |
458 |
| - public void add(K key, @Nullable V value) { |
459 |
| - List<V> values = this.map.computeIfAbsent(key, k -> new LinkedList<>()); |
460 |
| - values.add(value); |
461 |
| - } |
462 |
| - |
463 |
| - @Override |
464 |
| - public void addAll(K key, List<? extends V> values) { |
465 |
| - List<V> currentValues = this.map.computeIfAbsent(key, k -> new LinkedList<>()); |
466 |
| - currentValues.addAll(values); |
467 |
| - } |
468 |
| - |
469 |
| - @Override |
470 |
| - public void addAll(MultiValueMap<K, V> values) { |
471 |
| - for (Entry<K, List<V>> entry : values.entrySet()) { |
472 |
| - addAll(entry.getKey(), entry.getValue()); |
473 |
| - } |
474 |
| - } |
475 |
| - |
476 |
| - @Override |
477 |
| - public void set(K key, @Nullable V value) { |
478 |
| - List<V> values = new LinkedList<>(); |
479 |
| - values.add(value); |
480 |
| - this.map.put(key, values); |
481 |
| - } |
482 |
| - |
483 |
| - @Override |
484 |
| - public void setAll(Map<K, V> values) { |
485 |
| - values.forEach(this::set); |
486 |
| - } |
487 |
| - |
488 |
| - @Override |
489 |
| - public Map<K, V> toSingleValueMap() { |
490 |
| - LinkedHashMap<K, V> singleValueMap = new LinkedHashMap<>(this.map.size()); |
491 |
| - this.map.forEach((key, value) -> singleValueMap.put(key, value.get(0))); |
492 |
| - return singleValueMap; |
493 |
| - } |
494 |
| - |
495 |
| - @Override |
496 |
| - public int size() { |
497 |
| - return this.map.size(); |
498 |
| - } |
499 |
| - |
500 |
| - @Override |
501 |
| - public boolean isEmpty() { |
502 |
| - return this.map.isEmpty(); |
503 |
| - } |
504 |
| - |
505 |
| - @Override |
506 |
| - public boolean containsKey(Object key) { |
507 |
| - return this.map.containsKey(key); |
508 |
| - } |
509 |
| - |
510 |
| - @Override |
511 |
| - public boolean containsValue(Object value) { |
512 |
| - return this.map.containsValue(value); |
513 |
| - } |
514 |
| - |
515 |
| - @Override |
516 |
| - public List<V> get(Object key) { |
517 |
| - return this.map.get(key); |
518 |
| - } |
519 |
| - |
520 |
| - @Override |
521 |
| - public List<V> put(K key, List<V> value) { |
522 |
| - return this.map.put(key, value); |
523 |
| - } |
524 |
| - |
525 |
| - @Override |
526 |
| - public List<V> remove(Object key) { |
527 |
| - return this.map.remove(key); |
528 |
| - } |
529 |
| - |
530 |
| - @Override |
531 |
| - public void putAll(Map<? extends K, ? extends List<V>> map) { |
532 |
| - this.map.putAll(map); |
533 |
| - } |
534 |
| - |
535 |
| - @Override |
536 |
| - public void clear() { |
537 |
| - this.map.clear(); |
538 |
| - } |
539 |
| - |
540 |
| - @Override |
541 |
| - public Set<K> keySet() { |
542 |
| - return this.map.keySet(); |
543 |
| - } |
544 |
| - |
545 |
| - @Override |
546 |
| - public Collection<List<V>> values() { |
547 |
| - return this.map.values(); |
548 |
| - } |
549 |
| - |
550 |
| - @Override |
551 |
| - public Set<Entry<K, List<V>>> entrySet() { |
552 |
| - return this.map.entrySet(); |
553 |
| - } |
554 |
| - |
555 |
| - @Override |
556 |
| - public boolean equals(Object other) { |
557 |
| - if (this == other) { |
558 |
| - return true; |
559 |
| - } |
560 |
| - return this.map.equals(other); |
561 |
| - } |
562 |
| - |
563 |
| - @Override |
564 |
| - public int hashCode() { |
565 |
| - return this.map.hashCode(); |
566 |
| - } |
567 |
| - |
568 |
| - @Override |
569 |
| - public String toString() { |
570 |
| - return this.map.toString(); |
571 |
| - } |
572 |
| - } |
573 |
| - |
574 | 438 | }
|
0 commit comments