完善 MoreCollections 工具类。

feature/net-util
ZhouXY108 2023-07-06 10:07:37 +08:00
parent c7a3ad44dd
commit a88ff314c1
1 changed files with 59 additions and 19 deletions

View File

@ -10,7 +10,11 @@ import java.util.function.Function;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.google.common.base.Preconditions;
import com.google.common.collect.Table;
import xyz.zhouxy.plusone.commons.collection.SafeConcurrentHashMap; import xyz.zhouxy.plusone.commons.collection.SafeConcurrentHashMap;
import xyz.zhouxy.plusone.commons.collection.SynchronizedTable;
public class MoreCollections { public class MoreCollections {
@ -36,18 +40,23 @@ public class MoreCollections {
// Collection -> Map // Collection -> Map
public static <K, V> HashMap<K, V> toHashMap(Iterable<V> c, Function<? super V, K> keyGenerator, public static <K, V> HashMap<K, V> toHashMap(
Iterable<V> c,
Function<? super V, K> keyGenerator,
int initialCapacity) { int initialCapacity) {
HashMap<K, V> map = new HashMap<>(initialCapacity); HashMap<K, V> map = new HashMap<>(initialCapacity);
fillIntoEmptyMap(map, c, keyGenerator); fillIntoEmptyMap(map, c, keyGenerator);
return map; return map;
} }
public static <K, V> HashMap<K, V> toHashMap(Collection<V> c, Function<? super V, K> keyGenerator) { public static <K, V> HashMap<K, V> toHashMap(
Collection<V> c,
Function<? super V, K> keyGenerator) {
return toHashMap(c, keyGenerator, c.size()); return toHashMap(c, keyGenerator, c.size());
} }
public static <K, V> SafeConcurrentHashMap<K, V> toConcurrentHashMap(Iterable<V> c, public static <K, V> SafeConcurrentHashMap<K, V> toConcurrentHashMap(
Iterable<V> c,
Function<? super V, K> keyGenerator, Function<? super V, K> keyGenerator,
int initialCapacity) { int initialCapacity) {
SafeConcurrentHashMap<K, V> map = new SafeConcurrentHashMap<>(initialCapacity); SafeConcurrentHashMap<K, V> map = new SafeConcurrentHashMap<>(initialCapacity);
@ -55,29 +64,37 @@ public class MoreCollections {
return map; return map;
} }
public static <K, V> SafeConcurrentHashMap<K, V> toConcurrentHashMap(Collection<V> c, public static <K, V> SafeConcurrentHashMap<K, V> toConcurrentHashMap(
Collection<V> c,
Function<? super V, K> keyGenerator) { Function<? super V, K> keyGenerator) {
return toConcurrentHashMap(c, keyGenerator, c.size()); return toConcurrentHashMap(c, keyGenerator, c.size());
} }
public static <K extends Comparable<? super K>, V> TreeMap<K, V> toTreeMap(Iterable<V> c, Function<? super V, K> keyGenerator) { public static <K extends Comparable<? super K>, V> TreeMap<K, V> toTreeMap(
Iterable<V> c,
Function<? super V, K> keyGenerator) {
TreeMap<K, V> map = new TreeMap<>(); TreeMap<K, V> map = new TreeMap<>();
fillIntoEmptyMap(map, c, keyGenerator); fillIntoEmptyMap(map, c, keyGenerator);
return map; return map;
} }
public static <K, V> TreeMap<K, V> toTreeMap(Iterable<V> c, Function<? super V, K> keyGenerator, public static <K, V> TreeMap<K, V> toTreeMap(
Iterable<V> c,
Function<? super V, K> keyGenerator,
Comparator<? super K> keycComparator) { Comparator<? super K> keycComparator) {
TreeMap<K, V> map = new TreeMap<>(keycComparator); TreeMap<K, V> map = new TreeMap<>(keycComparator);
fillIntoEmptyMap(map, c, keyGenerator); fillIntoEmptyMap(map, c, keyGenerator);
return map; return map;
} }
public static <K, V> void fillIntoEmptyMap(Map<K, ? super V> map, Iterable<V> c, public static <K, V> void fillIntoEmptyMap(
Map<K, ? super V> map,
Iterable<V> c,
Function<? super V, K> keyGenerator) { Function<? super V, K> keyGenerator) {
if (map == null || !map.isEmpty()) { Preconditions.checkNotNull(map);
throw new IllegalArgumentException("The map should be empty."); Preconditions.checkNotNull(c);
} Preconditions.checkNotNull(keyGenerator);
Preconditions.checkArgument(map.isEmpty(), "The map should be empty.");
for (V v : c) { for (V v : c) {
map.put(keyGenerator.apply(v), v); map.put(keyGenerator.apply(v), v);
} }
@ -85,44 +102,67 @@ public class MoreCollections {
// array -> map // array -> map
public static <K, V> HashMap<K, V> toHashMap(V[] c, Function<? super V, K> keyGenerator, int initialCapacity) { public static <K, V> HashMap<K, V> toHashMap(
V[] c,
Function<? super V, K> keyGenerator,
int initialCapacity) {
HashMap<K, V> map = new HashMap<>(initialCapacity); HashMap<K, V> map = new HashMap<>(initialCapacity);
fillIntoEmptyMap(map, c, keyGenerator); fillIntoEmptyMap(map, c, keyGenerator);
return map; return map;
} }
public static <K, V> HashMap<K, V> toHashMap(V[] c, Function<? super V, K> keyGenerator) { public static <K, V> HashMap<K, V> toHashMap(
V[] c,
Function<? super V, K> keyGenerator) {
return toHashMap(c, keyGenerator, c.length); return toHashMap(c, keyGenerator, c.length);
} }
public static <K, V> SafeConcurrentHashMap<K, V> toConcurrentHashMap(V[] c, Function<? super V, K> keyGenerator, public static <K, V> SafeConcurrentHashMap<K, V> toConcurrentHashMap(
V[] c,
Function<? super V, K> keyGenerator,
int initialCapacity) { int initialCapacity) {
SafeConcurrentHashMap<K, V> map = new SafeConcurrentHashMap<>(initialCapacity); SafeConcurrentHashMap<K, V> map = new SafeConcurrentHashMap<>(initialCapacity);
fillIntoEmptyMap(map, c, keyGenerator); fillIntoEmptyMap(map, c, keyGenerator);
return map; return map;
} }
public static <K, V> SafeConcurrentHashMap<K, V> toConcurrentHashMap(V[] c, Function<? super V, K> keyGenerator) { public static <K, V> SafeConcurrentHashMap<K, V> toConcurrentHashMap(
V[] c,
Function<? super V, K> keyGenerator) {
return toConcurrentHashMap(c, keyGenerator, c.length); return toConcurrentHashMap(c, keyGenerator, c.length);
} }
public static <K extends Comparable<? super K>, V> TreeMap<K, V> toTreeMap(V[] c, Function<? super V, K> keyGenerator) { public static <K extends Comparable<? super K>, V> TreeMap<K, V> toTreeMap(
V[] c,
Function<? super V, K> keyGenerator) {
TreeMap<K, V> map = new TreeMap<>(); TreeMap<K, V> map = new TreeMap<>();
fillIntoEmptyMap(map, c, keyGenerator); fillIntoEmptyMap(map, c, keyGenerator);
return map; return map;
} }
public static <K, V> TreeMap<K, V> toTreeMap(V[] c, Function<? super V, K> keyGenerator, public static <K, V> TreeMap<K, V> toTreeMap(
Comparator<? super K> keycComparator) { V[] c,
TreeMap<K, V> map = new TreeMap<>(keycComparator); Function<? super V, K> keyGenerator,
Comparator<? super K> keyComparator) {
TreeMap<K, V> map = new TreeMap<>(keyComparator);
fillIntoEmptyMap(map, c, keyGenerator); fillIntoEmptyMap(map, c, keyGenerator);
return map; return map;
} }
public static <K, V> void fillIntoEmptyMap(Map<K, ? super V> map, V[] c, Function<? super V, K> keyGenerator) { public static <K, V> void fillIntoEmptyMap(
Map<K, ? super V> map, V[] c,
Function<? super V, K> keyGenerator) {
fillIntoEmptyMap(map, Arrays.asList(c), keyGenerator); fillIntoEmptyMap(map, Arrays.asList(c), keyGenerator);
} }
public static <R, C, V> Table<R, C, V> synchronizedTable(Table<R, C, V> t) {
if (t instanceof SynchronizedTable) {
return t;
} else {
return SynchronizedTable.of(t);
}
}
private MoreCollections() { private MoreCollections() {
throw new IllegalStateException("Utility class"); throw new IllegalStateException("Utility class");
} }