1
16 package org.springframework.data.util;
17
18 import lombok.AccessLevel;
19 import lombok.NonNull;
20 import lombok.RequiredArgsConstructor;
21
22 import java.util.EnumSet;
23 import java.util.HashMap;
24 import java.util.Set;
25 import java.util.function.BiConsumer;
26 import java.util.function.BinaryOperator;
27 import java.util.function.Function;
28 import java.util.function.Supplier;
29 import java.util.stream.Collector;
30
31 import org.springframework.util.CollectionUtils;
32 import org.springframework.util.MultiValueMap;
33
34
40 @RequiredArgsConstructor(access = AccessLevel.PACKAGE, staticName = "of")
41 class MultiValueMapCollector<T, K, V> implements Collector<T, MultiValueMap<K, V>, MultiValueMap<K, V>> {
42
43 private final @NonNull Function<T, K> keyFunction;
44 private final @NonNull Function<T, V> valueFunction;
45
46
50 @Override
51 public Supplier<MultiValueMap<K, V>> supplier() {
52 return () -> CollectionUtils.toMultiValueMap(new HashMap<>());
53 }
54
55
59 @Override
60 public BiConsumer<MultiValueMap<K, V>, T> accumulator() {
61 return (map, t) -> map.add(keyFunction.apply(t), valueFunction.apply(t));
62 }
63
64
68 @Override
69 public BinaryOperator<MultiValueMap<K, V>> combiner() {
70
71 return (map1, map2) -> {
72
73 for (K key : map2.keySet()) {
74 map1.addAll(key, map2.get(key));
75 }
76
77 return map1;
78 };
79 }
80
81
85 @Override
86 public Function<MultiValueMap<K, V>, MultiValueMap<K, V>> finisher() {
87 return Function.identity();
88 }
89
90
94 @Override
95 public Set<Characteristics> characteristics() {
96 return EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.UNORDERED);
97 }
98 }
99