diff --git a/src/main/java/net/woggioni/jwo/CollectionUtils.java b/src/main/java/net/woggioni/jwo/CollectionUtils.java index 5627471..7eee038 100644 --- a/src/main/java/net/woggioni/jwo/CollectionUtils.java +++ b/src/main/java/net/woggioni/jwo/CollectionUtils.java @@ -10,10 +10,12 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.TreeSet; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collector; import java.util.stream.Stream; @@ -124,12 +126,27 @@ public class CollectionUtils { }; } - public static Collector> toUnmodifiableMap(Function keyExtractor, Function valueExtractor) { + public static Collector> toUnmodifiableHashMap( + Function keyExtractor, + Function valueExtractor) { + return toUnmodifiableMap(HashMap::new, keyExtractor, valueExtractor); + } + + public static Collector> toUnmodifiableTreeMap( + Function keyExtractor, + Function valueExtractor) { + return toUnmodifiableMap(TreeMap::new, keyExtractor, valueExtractor); + } + + public static Collector> toUnmodifiableMap( + Supplier> constructor, + Function keyExtractor, + Function valueExtractor) { BiConsumer, T> accumulator = (map, streamElement) -> { map.merge(keyExtractor.apply(streamElement), valueExtractor.apply(streamElement), throwingMerger()); }; return Collector.of( - HashMap::new, + constructor, accumulator, mapMerger(throwingMerger()), Collections::unmodifiableMap diff --git a/src/main/java/net/woggioni/jwo/JWO.java b/src/main/java/net/woggioni/jwo/JWO.java index 34dd6f2..b52b9f9 100644 --- a/src/main/java/net/woggioni/jwo/JWO.java +++ b/src/main/java/net/woggioni/jwo/JWO.java @@ -338,4 +338,17 @@ public class JWO { return Optional.empty(); } } + + public static Map enumReverseMap(Class cls) { + return Arrays.stream(cls.getEnumConstants()) + .collect(CollectionUtils.toUnmodifiableTreeMap(Object::toString, Function.identity())); + } + + public static T enumFromString(Class cls, Map reverseMap, String value) { + T result = reverseMap.get(value); + if (result == null) + throw newThrowable(IllegalArgumentException.class, + "Unknown value '%s' for enum %s", value, cls.getName()); + return result; + } }