@@ -100,7 +100,7 @@ public static <K, V> LinkedHashMap<K, V> narrow(LinkedHashMap<? extends K, ? ext
100100 public static <K , V > LinkedHashMap <K , V > of (Tuple2 <? extends K , ? extends V > entry ) {
101101 final HashMap <K , V > map = HashMap .of (entry );
102102 final Queue <Tuple2 <K , V >> list = Queue .of ((Tuple2 <K , V >) entry );
103- return new LinkedHashMap <> (list , map );
103+ return wrap (list , map );
104104 }
105105
106106 /**
@@ -164,7 +164,7 @@ public static <T, K, V> LinkedHashMap<K, V> ofAll(java.util.stream.Stream<? exte
164164 public static <K , V > LinkedHashMap <K , V > of (K key , V value ) {
165165 final HashMap <K , V > map = HashMap .of (key , value );
166166 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (key , value ));
167- return new LinkedHashMap <> (list , map );
167+ return wrap (list , map );
168168 }
169169
170170 /**
@@ -181,7 +181,7 @@ public static <K, V> LinkedHashMap<K, V> of(K key, V value) {
181181 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 ) {
182182 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 );
183183 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ));
184- return new LinkedHashMap <> (list , map );
184+ return wrapNonUnique (list , map );
185185 }
186186
187187 /**
@@ -200,7 +200,7 @@ public static <K, V> LinkedHashMap<K, V> of(K k1, V v1, K k2, V v2) {
200200 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 , K k3 , V v3 ) {
201201 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 , k3 , v3 );
202202 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ), Tuple .of (k3 , v3 ));
203- return new LinkedHashMap <> (list , map );
203+ return wrapNonUnique (list , map );
204204 }
205205
206206 /**
@@ -221,7 +221,7 @@ public static <K, V> LinkedHashMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3)
221221 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 , K k3 , V v3 , K k4 , V v4 ) {
222222 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 , k3 , v3 , k4 , v4 );
223223 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ), Tuple .of (k3 , v3 ), Tuple .of (k4 , v4 ));
224- return new LinkedHashMap <> (list , map );
224+ return wrapNonUnique (list , map );
225225 }
226226
227227 /**
@@ -244,7 +244,7 @@ public static <K, V> LinkedHashMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3,
244244 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 , K k3 , V v3 , K k4 , V v4 , K k5 , V v5 ) {
245245 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 , k3 , v3 , k4 , v4 , k5 , v5 );
246246 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ), Tuple .of (k3 , v3 ), Tuple .of (k4 , v4 ), Tuple .of (k5 , v5 ));
247- return new LinkedHashMap <> (list , map );
247+ return wrapNonUnique (list , map );
248248 }
249249
250250 /**
@@ -269,7 +269,7 @@ public static <K, V> LinkedHashMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3,
269269 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 , K k3 , V v3 , K k4 , V v4 , K k5 , V v5 , K k6 , V v6 ) {
270270 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 , k3 , v3 , k4 , v4 , k5 , v5 , k6 , v6 );
271271 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ), Tuple .of (k3 , v3 ), Tuple .of (k4 , v4 ), Tuple .of (k5 , v5 ), Tuple .of (k6 , v6 ));
272- return new LinkedHashMap <> (list , map );
272+ return wrapNonUnique (list , map );
273273 }
274274
275275 /**
@@ -296,7 +296,7 @@ public static <K, V> LinkedHashMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3,
296296 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 , K k3 , V v3 , K k4 , V v4 , K k5 , V v5 , K k6 , V v6 , K k7 , V v7 ) {
297297 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 , k3 , v3 , k4 , v4 , k5 , v5 , k6 , v6 , k7 , v7 );
298298 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ), Tuple .of (k3 , v3 ), Tuple .of (k4 , v4 ), Tuple .of (k5 , v5 ), Tuple .of (k6 , v6 ), Tuple .of (k7 , v7 ));
299- return new LinkedHashMap <> (list , map );
299+ return wrapNonUnique (list , map );
300300 }
301301
302302 /**
@@ -325,7 +325,7 @@ public static <K, V> LinkedHashMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3,
325325 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 , K k3 , V v3 , K k4 , V v4 , K k5 , V v5 , K k6 , V v6 , K k7 , V v7 , K k8 , V v8 ) {
326326 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 , k3 , v3 , k4 , v4 , k5 , v5 , k6 , v6 , k7 , v7 , k8 , v8 );
327327 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ), Tuple .of (k3 , v3 ), Tuple .of (k4 , v4 ), Tuple .of (k5 , v5 ), Tuple .of (k6 , v6 ), Tuple .of (k7 , v7 ), Tuple .of (k8 , v8 ));
328- return new LinkedHashMap <> (list , map );
328+ return wrapNonUnique (list , map );
329329 }
330330
331331 /**
@@ -356,7 +356,7 @@ public static <K, V> LinkedHashMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3,
356356 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 , K k3 , V v3 , K k4 , V v4 , K k5 , V v5 , K k6 , V v6 , K k7 , V v7 , K k8 , V v8 , K k9 , V v9 ) {
357357 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 , k3 , v3 , k4 , v4 , k5 , v5 , k6 , v6 , k7 , v7 , k8 , v8 , k9 , v9 );
358358 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ), Tuple .of (k3 , v3 ), Tuple .of (k4 , v4 ), Tuple .of (k5 , v5 ), Tuple .of (k6 , v6 ), Tuple .of (k7 , v7 ), Tuple .of (k8 , v8 ), Tuple .of (k9 , v9 ));
359- return new LinkedHashMap <> (list , map );
359+ return wrapNonUnique (list , map );
360360 }
361361
362362 /**
@@ -389,7 +389,7 @@ public static <K, V> LinkedHashMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3,
389389 public static <K , V > LinkedHashMap <K , V > of (K k1 , V v1 , K k2 , V v2 , K k3 , V v3 , K k4 , V v4 , K k5 , V v5 , K k6 , V v6 , K k7 , V v7 , K k8 , V v8 , K k9 , V v9 , K k10 , V v10 ) {
390390 final HashMap <K , V > map = HashMap .of (k1 , v1 , k2 , v2 , k3 , v3 , k4 , v4 , k5 , v5 , k6 , v6 , k7 , v7 , k8 , v8 , k9 , v9 , k10 , v10 );
391391 final Queue <Tuple2 <K , V >> list = Queue .of (Tuple .of (k1 , v1 ), Tuple .of (k2 , v2 ), Tuple .of (k3 , v3 ), Tuple .of (k4 , v4 ), Tuple .of (k5 , v5 ), Tuple .of (k6 , v6 ), Tuple .of (k7 , v7 ), Tuple .of (k8 , v8 ), Tuple .of (k9 , v9 ), Tuple .of (k10 , v10 ));
392- return new LinkedHashMap <> (list , map );
392+ return wrapNonUnique (list , map );
393393 }
394394
395395 /**
@@ -442,7 +442,7 @@ public static <K, V> LinkedHashMap<K, V> ofEntries(java.util.Map.Entry<? extends
442442 map = map .put (tuple );
443443 list = list .append (tuple );
444444 }
445- return wrap (list , map );
445+ return wrapNonUnique (list , map );
446446 }
447447
448448 /**
@@ -457,7 +457,7 @@ public static <K, V> LinkedHashMap<K, V> ofEntries(java.util.Map.Entry<? extends
457457 public static <K , V > LinkedHashMap <K , V > ofEntries (Tuple2 <? extends K , ? extends V >... entries ) {
458458 final HashMap <K , V > map = HashMap .ofEntries (entries );
459459 final Queue <Tuple2 <K , V >> list = Queue .of ((Tuple2 <K , V >[]) entries );
460- return wrap (list , map );
460+ return wrapNonUnique (list , map );
461461 }
462462
463463 /**
@@ -480,7 +480,7 @@ public static <K, V> LinkedHashMap<K, V> ofEntries(Iterable<? extends Tuple2<? e
480480 map = map .put (entry );
481481 list = list .append ((Tuple2 <K , V >) entry );
482482 }
483- return wrap (list , map );
483+ return wrapNonUnique (list , map );
484484 }
485485 }
486486
@@ -738,7 +738,7 @@ public LinkedHashMap<K, V> put(K key, V value) {
738738 newList = list .append (Tuple .of (key , value ));
739739 }
740740 final HashMap <K , V > newMap = map .put (key , value );
741- return new LinkedHashMap <> (newList , newMap );
741+ return wrap (newList , newMap );
742742 }
743743
744744 @ Override
@@ -952,10 +952,32 @@ public String toString() {
952952 return mkString (stringPrefix () + "(" , ", " , ")" );
953953 }
954954
955+ /**
956+ * Construct Map with given values and key order.
957+ *
958+ * @param list The list of key-value tuples with unique keys.
959+ * @param map The map of key-value tuples.
960+ * @param <K> The key type
961+ * @param <V> The value type
962+ * @return A new Map containing the given map with given key order
963+ */
955964 private static <K , V > LinkedHashMap <K , V > wrap (Queue <Tuple2 <K , V >> list , HashMap <K , V > map ) {
956965 return list .isEmpty () ? empty () : new LinkedHashMap <>(list , map );
957966 }
958967
968+ /**
969+ * Construct Map with given values and key order.
970+ *
971+ * @param list The list of key-value tuples with non-unique keys.
972+ * @param map The map of key-value tuples.
973+ * @param <K> The key type
974+ * @param <V> The value type
975+ * @return A new Map containing the given map with given key order
976+ */
977+ private static <K , V > LinkedHashMap <K , V > wrapNonUnique (Queue <Tuple2 <K , V >> list , HashMap <K , V > map ) {
978+ return list .isEmpty () ? empty () : new LinkedHashMap <>(list .reverse ().distinctBy (Tuple2 ::_1 ).reverse ().toQueue (), map );
979+ }
980+
959981 // We need this method to narrow the argument of `ofEntries`.
960982 // If this method is static with type args <K, V>, the jdk fails to infer types at the call site.
961983 private LinkedHashMap <K , V > createFromEntries (Iterable <Tuple2 <K , V >> tuples ) {
0 commit comments