You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/11/19 14:16:07 UTC
[commons-lang] 02/02: Add EnumUtils.getEnumMap(Class, Function). #730.
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
commit 8a4d1b82f8d5556c866701b556d78fd3e2d4d88a
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Nov 19 09:16:03 2021 -0500
Add EnumUtils.getEnumMap(Class, Function). #730.
Provides a different implementation than #730.
---
src/changes/changes.xml | 1 +
.../java/org/apache/commons/lang3/EnumUtils.java | 29 ++++++++++---
.../org/apache/commons/lang3/EnumUtilsTest.java | 48 ++++++++++++++++++++++
3 files changed, 72 insertions(+), 6 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index da516cd..7b0ffe5 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -101,6 +101,7 @@ The <action> type attribute can be add,update,fix,remove.
<action type="add" dev="ggregory" due-to="Gary Gregory">Add Streams.toStream(Collection).</action>
<action type="add" dev="ggregory" due-to="Gary Gregory">Add Streams.failableStream(Collection) and deprecate misnamed stream(Collection).</action>
<action type="add" dev="ggregory" due-to="Gary Gregory">Add Streams.failableStream(Stream) and deprecate misnamed stream(Stream).</action>
+ <action type="add" dev="ggregory" due-to="Maxwell Cody, Gary Gregory">Add EnumUtils.getEnumMap(Class, Function). #730</action>
<!-- UPDATE -->
<action type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">Bump spotbugs-maven-plugin from 4.2.0 to 4.4.2.2 #735, #808, #822.</action>
<action type="update" dev="ggregory" due-to="Dependabot, XenoAmess">Bump Bump actions/cache from v2.1.4 to v2.1.6 #742, #752, #764.</action>
diff --git a/src/main/java/org/apache/commons/lang3/EnumUtils.java b/src/main/java/org/apache/commons/lang3/EnumUtils.java
index 6bab891..c27b318 100644
--- a/src/main/java/org/apache/commons/lang3/EnumUtils.java
+++ b/src/main/java/org/apache/commons/lang3/EnumUtils.java
@@ -20,10 +20,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
/**
* <p>Utility library to provide helper methods for Java enums.</p>
@@ -281,11 +282,27 @@ public class EnumUtils {
* @return the modifiable map of enum names to enums, never null
*/
public static <E extends Enum<E>> Map<String, E> getEnumMap(final Class<E> enumClass) {
- final Map<String, E> map = new LinkedHashMap<>();
- for (final E e: enumClass.getEnumConstants()) {
- map.put(e.name(), e);
- }
- return map;
+ return getEnumMap(enumClass, E::name);
+ }
+
+ /**
+ * <p>
+ * Gets the {@code Map} of enums by name.
+ * </p>
+ *
+ * <p>
+ * This method is useful when you need a map of enums by name.
+ * </p>
+ *
+ * @param <E> the type of enumeration
+ * @param <K> the type of the map key
+ * @param enumClass the class of the enum to query, not null
+ * @param keyFunction the function to query for the key, not null
+ * @return the modifiable map of enums, never null
+ * @since 3.13.0
+ */
+ public static <E extends Enum<E>, K> Map<K, E> getEnumMap(final Class<E> enumClass, final Function<E, K> keyFunction) {
+ return Stream.of(enumClass.getEnumConstants()).collect(Collectors.toMap(keyFunction::apply, Function.identity()));
}
/**
diff --git a/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java b/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java
index 6ebc374..6fde2dd 100644
--- a/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/EnumUtilsTest.java
@@ -343,6 +343,40 @@ public class EnumUtilsTest {
}
@Test
+ public void test_getEnumMap_keyFunction() {
+ final Map<Integer, Month> test = EnumUtils.getEnumMap(Month.class, Month::getId);
+ assertEquals("{1=JAN, 2=FEB, 3=MAR, 4=APR, 5=MAY, 6=JUN, 7=JUL, 8=AUG, 9=SEP, 10=OCT, 11=NOV, 12=DEC}", test.toString(),
+ "getEnumMap not created correctly");
+ assertEquals(12, test.size());
+ assertFalse(test.containsKey(0));
+ assertTrue(test.containsKey(1));
+ assertEquals(Month.JAN, test.get(1));
+ assertTrue(test.containsKey(2));
+ assertEquals(Month.FEB, test.get(2));
+ assertTrue(test.containsKey(3));
+ assertEquals(Month.MAR, test.get(3));
+ assertTrue(test.containsKey(4));
+ assertEquals(Month.APR, test.get(4));
+ assertTrue(test.containsKey(5));
+ assertEquals(Month.MAY, test.get(5));
+ assertTrue(test.containsKey(6));
+ assertEquals(Month.JUN, test.get(6));
+ assertTrue(test.containsKey(7));
+ assertEquals(Month.JUL, test.get(7));
+ assertTrue(test.containsKey(8));
+ assertEquals(Month.AUG, test.get(8));
+ assertTrue(test.containsKey(9));
+ assertEquals(Month.SEP, test.get(9));
+ assertTrue(test.containsKey(10));
+ assertEquals(Month.OCT, test.get(10));
+ assertTrue(test.containsKey(11));
+ assertEquals(Month.NOV, test.get(11));
+ assertTrue(test.containsKey(12));
+ assertEquals(Month.DEC, test.get(12));
+ assertFalse(test.containsKey(13));
+ }
+
+ @Test
public void test_getEnumSystemProperty() {
final String key = getClass().getName();
System.setProperty(key, Traffic.RED.toString());
@@ -531,6 +565,20 @@ public class EnumUtilsTest {
}
+enum Month {
+ JAN(1), FEB(2), MAR(3), APR(4), MAY(5), JUN(6), JUL(7), AUG(8), SEP(9), OCT(10), NOV(11), DEC(12);
+
+ private final int id;
+
+ Month(int id) {
+ this.id = id;
+ }
+
+ public int getId() {
+ return this.id;
+ }
+}
+
enum TooMany {
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, A1, B1, C1, D1, E1, F1, G1, H1, I1,
J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2,