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:05 UTC

[commons-lang] branch master updated (7f9472e -> 8a4d1b8)

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git.


    from 7f9472e  Fix Javadoc typo.
     new 70abafc  Sort members.
     new 8a4d1b8  Add EnumUtils.getEnumMap(Class, Function). #730.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/changes/changes.xml                            |  1 +
 .../java/org/apache/commons/lang3/EnumUtils.java   | 83 +++++++++++++---------
 .../org/apache/commons/lang3/EnumUtilsTest.java    | 48 +++++++++++++
 3 files changed, 99 insertions(+), 33 deletions(-)

[commons-lang] 02/02: Add EnumUtils.getEnumMap(Class, Function). #730.

Posted by gg...@apache.org.
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,

[commons-lang] 01/02: Sort members.

Posted by gg...@apache.org.
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 70abafc95d2de789f5292c7f5df9bb4d39c2bdb9
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Nov 19 09:07:52 2021 -0500

    Sort members.
---
 .../java/org/apache/commons/lang3/EnumUtils.java   | 54 +++++++++++-----------
 1 file changed, 27 insertions(+), 27 deletions(-)

diff --git a/src/main/java/org/apache/commons/lang3/EnumUtils.java b/src/main/java/org/apache/commons/lang3/EnumUtils.java
index 6905c3c..6bab891 100644
--- a/src/main/java/org/apache/commons/lang3/EnumUtils.java
+++ b/src/main/java/org/apache/commons/lang3/EnumUtils.java
@@ -259,33 +259,6 @@ public class EnumUtils {
     }
 
     /**
-     * <p>Gets the enum for the class, returning {@code defaultEnum} if not found.</p>
-     *
-     * <p>This method differs from {@link Enum#valueOf} in that it does not throw an exception
-     * for an invalid enum name and performs case insensitive matching of the name.</p>
-     *
-     * @param <E>         the type of the enumeration
-     * @param enumClass   the class of the enum to query, not null
-     * @param enumName    the enum name, null returns default enum
-     * @param stringFunction the function that gets the string for an enum for comparison to {@code enumName}.
-     * @param defaultEnum the default enum
-     * @return the enum, default enum if not found
-     * @since 3.13.0
-     */
-    public static <E extends Enum<E>> E getFirstEnumIgnoreCase(final Class<E> enumClass, final String enumName,
-        final Function<E, String> stringFunction, final E defaultEnum) {
-        if (enumName == null || !enumClass.isEnum()) {
-            return defaultEnum;
-        }
-        for (final E each : enumClass.getEnumConstants()) {
-            if (enumName.equalsIgnoreCase(stringFunction.apply(each))) {
-                return each;
-            }
-        }
-        return defaultEnum;
-    }
-
-    /**
      * <p>Gets the {@code List} of enums.</p>
      *
      * <p>This method is useful when you need a list of enums rather than an array.</p>
@@ -338,6 +311,33 @@ public class EnumUtils {
     }
 
     /**
+     * <p>Gets the enum for the class, returning {@code defaultEnum} if not found.</p>
+     *
+     * <p>This method differs from {@link Enum#valueOf} in that it does not throw an exception
+     * for an invalid enum name and performs case insensitive matching of the name.</p>
+     *
+     * @param <E>         the type of the enumeration
+     * @param enumClass   the class of the enum to query, not null
+     * @param enumName    the enum name, null returns default enum
+     * @param stringFunction the function that gets the string for an enum for comparison to {@code enumName}.
+     * @param defaultEnum the default enum
+     * @return the enum, default enum if not found
+     * @since 3.13.0
+     */
+    public static <E extends Enum<E>> E getFirstEnumIgnoreCase(final Class<E> enumClass, final String enumName,
+        final Function<E, String> stringFunction, final E defaultEnum) {
+        if (enumName == null || !enumClass.isEnum()) {
+            return defaultEnum;
+        }
+        for (final E each : enumClass.getEnumConstants()) {
+            if (enumName.equalsIgnoreCase(stringFunction.apply(each))) {
+                return each;
+            }
+        }
+        return defaultEnum;
+    }
+
+    /**
      * <p>Checks if the specified name is a valid enum for the class.</p>
      *
      * <p>This method differs from {@link Enum#valueOf} in that checks if the name is