Skip to content

Commit 8e1f5a9

Browse files
committed
Add EnumSet.stream(Class)
1 parent 5714312 commit 8e1f5a9

File tree

3 files changed

+32
-9
lines changed

3 files changed

+32
-9
lines changed

src/changes/changes.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ The <action> type attribute can be add,update,fix,remove.
137137
<action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.commons.lang3.concurrent.locks.LockingVisitors.create(Object, ReentrantLock).</action>
138138
<action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.commons.lang3.concurrent.locks.LockingVisitors.ReentrantLockVisitor.</action>
139139
<action type="add" dev="ggregory" due-to="Gary Gregory">Add builders for LockingVisitors implementations.</action>
140+
<action type="add" dev="ggregory" due-to="Gary Gregory">Add EnumSet.stream(Class).</action>
140141
<!-- UPDATE -->
141142
<action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.apache.commons:commons-parent from 73 to 85 #1267, #1277, #1283, #1288, #1302, #1377.</action>
142143
<action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">[site] Bump org.codehaus.mojo:taglist-maven-plugin from 3.1.0 to 3.2.1 #1300.</action>

src/main/java/org/apache/commons/lang3/EnumUtils.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import java.util.stream.Collectors;
2929
import java.util.stream.Stream;
3030

31+
import org.apache.commons.lang3.stream.Streams;
32+
3133
/**
3234
* Utility library to provide helper methods for Java enums.
3335
*
@@ -68,8 +70,8 @@ private static <E extends Enum<E>> Class<E> asEnum(final Class<E> enumClass) {
6870
*/
6971
private static <E extends Enum<E>> Class<E> checkBitVectorable(final Class<E> enumClass) {
7072
final E[] constants = asEnum(enumClass).getEnumConstants();
71-
Validate.isTrue(constants.length <= Long.SIZE, CANNOT_STORE_S_S_VALUES_IN_S_BITS,
72-
Integer.valueOf(constants.length), enumClass.getSimpleName(), Integer.valueOf(Long.SIZE));
73+
Validate.isTrue(constants.length <= Long.SIZE, CANNOT_STORE_S_S_VALUES_IN_S_BITS, Integer.valueOf(constants.length), enumClass.getSimpleName(),
74+
Integer.valueOf(Long.SIZE));
7375
return enumClass;
7476
}
7577

@@ -298,7 +300,7 @@ public static <E extends Enum<E>> Map<String, E> getEnumMap(final Class<E> enumC
298300
* @since 3.13.0
299301
*/
300302
public static <E extends Enum<E>, K> Map<K, E> getEnumMap(final Class<E> enumClass, final Function<E, K> keyFunction) {
301-
return Stream.of(enumClass.getEnumConstants()).collect(Collectors.toMap(keyFunction::apply, Function.identity()));
303+
return stream(enumClass).collect(Collectors.toMap(keyFunction::apply, Function.identity()));
302304
}
303305

304306
/**
@@ -341,7 +343,7 @@ public static <E extends Enum<E>> E getFirstEnum(final Class<E> enumClass, final
341343
if (isEnum(enumClass)) {
342344
return defaultEnum;
343345
}
344-
return Stream.of(enumClass.getEnumConstants()).filter(e -> value == toIntFunction.applyAsInt(e)).findFirst().orElse(defaultEnum);
346+
return stream(enumClass).filter(e -> value == toIntFunction.applyAsInt(e)).findFirst().orElse(defaultEnum);
345347
}
346348

347349
/**
@@ -363,7 +365,7 @@ public static <E extends Enum<E>> E getFirstEnumIgnoreCase(final Class<E> enumCl
363365
if (enumName == null || !enumClass.isEnum()) {
364366
return defaultEnum;
365367
}
366-
return Stream.of(enumClass.getEnumConstants()).filter(e -> enumName.equalsIgnoreCase(stringFunction.apply(e))).findFirst().orElse(defaultEnum);
368+
return stream(enumClass).filter(e -> enumName.equalsIgnoreCase(stringFunction.apply(e))).findFirst().orElse(defaultEnum);
367369
}
368370

369371
private static <E extends Enum<E>> boolean isEnum(final Class<E> enumClass) {
@@ -416,8 +418,7 @@ public static <E extends Enum<E>> boolean isValidEnumIgnoreCase(final Class<E> e
416418
* @since 3.0.1
417419
*/
418420
public static <E extends Enum<E>> EnumSet<E> processBitVector(final Class<E> enumClass, final long value) {
419-
checkBitVectorable(enumClass).getEnumConstants();
420-
return processBitVectors(enumClass, value);
421+
return processBitVectors(checkBitVectorable(enumClass), value);
421422
}
422423

423424
/**
@@ -437,15 +438,28 @@ public static <E extends Enum<E>> EnumSet<E> processBitVectors(final Class<E> en
437438
final EnumSet<E> results = EnumSet.noneOf(asEnum(enumClass));
438439
final long[] lvalues = ArrayUtils.clone(Objects.requireNonNull(values, "values"));
439440
ArrayUtils.reverse(lvalues);
440-
for (final E constant : enumClass.getEnumConstants()) {
441+
stream(enumClass).forEach(constant -> {
441442
final int block = constant.ordinal() / Long.SIZE;
442443
if (block < lvalues.length && (lvalues[block] & 1L << constant.ordinal() % Long.SIZE) != 0) {
443444
results.add(constant);
444445
}
445-
}
446+
});
446447
return results;
447448
}
448449

450+
/**
451+
* Returns a sequential ordered stream whose elements are the given class' enum values.
452+
*
453+
* @param <T> the type of stream elements.
454+
* @param clazz the class containing the enum values.
455+
* @return the new stream.
456+
* @since 3.18.0
457+
* @see Class#getEnumConstants()
458+
*/
459+
public static <T> Stream<T> stream(final Class<T> clazz) {
460+
return Streams.of(clazz.getEnumConstants());
461+
}
462+
449463
/**
450464
* This constructor is public to permit tools that require a JavaBean
451465
* instance to operate.

src/test/java/org/apache/commons/lang3/EnumUtilsTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.List;
3333
import java.util.Map;
34+
import java.util.concurrent.TimeUnit;
3435
import java.util.function.Function;
3536
import java.util.function.ToIntFunction;
3637

@@ -606,6 +607,13 @@ void testProcessBitVectors_nullClass() {
606607
assertNullPointerException(() -> EnumUtils.processBitVectors(empty, 0L));
607608
}
608609

610+
@Test
611+
void testStream() {
612+
assertEquals(7, EnumUtils.stream(TimeUnit.class).count());
613+
Assertions.assertArrayEquals(TimeUnit.values(), EnumUtils.stream(TimeUnit.class).toArray(TimeUnit[]::new));
614+
assertEquals(0, EnumUtils.stream(Object.class).count());
615+
}
616+
609617
}
610618

611619
enum Month {

0 commit comments

Comments
 (0)