Skip to content

Commit 603b7aa

Browse files
loolygitee-org
authored andcommitted
!1283 添加 EnumUtil#getBy(Class, Func1, Object)方法,最终的条件过滤统一使用 EnumUtil#getBy(Class, Predicate, Enum) 方法
Merge pull request !1283 from 罗敬/v5-dev
2 parents 8a8a5f7 + a62f7f3 commit 603b7aa

File tree

1 file changed

+64
-16
lines changed

1 file changed

+64
-16
lines changed

hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ public static String toString(Enum<?> e) {
6060
* @since 5.1.6
6161
*/
6262
public static <E extends Enum<E>> E getEnumAt(Class<E> enumClass, int index) {
63-
if(null == enumClass){
63+
if (null == enumClass) {
6464
return null;
6565
}
6666
final E[] enumConstants = enumClass.getEnumConstants();
67-
if(index < 0){
67+
if (index < 0) {
6868
index = enumConstants.length + index;
6969
}
7070

@@ -129,7 +129,7 @@ public static <E extends Enum<E>> E fromStringQuietly(Class<E> enumClass, String
129129
*/
130130
@SuppressWarnings("unchecked")
131131
public static <E extends Enum<E>> E likeValueOf(Class<E> enumClass, Object value) {
132-
if(null == enumClass || null == value){
132+
if (null == enumClass || null == value) {
133133
return null;
134134
}
135135
if (value instanceof CharSequence) {
@@ -161,7 +161,7 @@ public static <E extends Enum<E>> E likeValueOf(Class<E> enumClass, Object value
161161
* @return name列表
162162
*/
163163
public static List<String> getNames(Class<? extends Enum<?>> clazz) {
164-
if(null == clazz){
164+
if (null == clazz) {
165165
return null;
166166
}
167167
final Enum<?>[] enums = clazz.getEnumConstants();
@@ -183,7 +183,7 @@ public static List<String> getNames(Class<? extends Enum<?>> clazz) {
183183
* @return 字段值列表
184184
*/
185185
public static List<Object> getFieldValues(Class<? extends Enum<?>> clazz, String fieldName) {
186-
if(null == clazz || StrUtil.isBlank(fieldName)){
186+
if (null == clazz || StrUtil.isBlank(fieldName)) {
187187
return null;
188188
}
189189
final Enum<?>[] enums = clazz.getEnumConstants();
@@ -210,7 +210,7 @@ public static List<Object> getFieldValues(Class<? extends Enum<?>> clazz, String
210210
* @since 4.1.20
211211
*/
212212
public static List<String> getFieldNames(Class<? extends Enum<?>> clazz) {
213-
if(null == clazz){
213+
if (null == clazz) {
214214
return null;
215215
}
216216
final List<String> names = new ArrayList<>();
@@ -238,11 +238,62 @@ public static List<String> getFieldNames(Class<? extends Enum<?>> clazz) {
238238
* @since 5.8.0
239239
*/
240240
public static <E extends Enum<E>> E getBy(Class<E> enumClass, Predicate<? super E> predicate) {
241-
if(null == enumClass || null == predicate){
241+
return getBy(enumClass, predicate, null);
242+
}
243+
244+
/**
245+
* 通过 某字段对应值 获取 枚举,获取不到时为 {@code defaultEnum}
246+
*
247+
* @param enumClass 枚举类
248+
* @param predicate 条件
249+
* @param defaultEnum 获取不到时的默认枚举值
250+
* @param <E> 枚举类型
251+
* @return 对应枚举 ,获取不到时为 {@code defaultEnum}
252+
*/
253+
public static <E extends Enum<E>> E getBy(Class<E> enumClass, Predicate<? super E> predicate, E defaultEnum) {
254+
if (null == enumClass || null == predicate) {
242255
return null;
243256
}
244257
return Arrays.stream(enumClass.getEnumConstants())
245-
.filter(predicate).findFirst().orElse(null);
258+
.filter(predicate).findFirst().orElse(defaultEnum);
259+
}
260+
261+
/**
262+
* 通过 某字段对应值 获取 枚举,获取不到时为 {@code null}
263+
* <p/>
264+
* {@link LambdaUtil#getRealClass(Func1)}} 是相对耗时的
265+
* 如果枚举值比较多,那么{@link EnumUtil#getBy(Func1, Object)} 方法
266+
* 大部分时间都是被{@link LambdaUtil#getRealClass(Func1)}}所消耗的
267+
* <br/>
268+
* 如果可以在编码过程中可以提供对应的枚举类 该方法与枚举的{@code Enum.values()}方法是差不多的。
269+
*
270+
* @param enumClass 枚举类, 为{@code null}返回{@code null}
271+
* @param condition 条件字段,为{@code null}返回{@code null}
272+
* @param value 条件字段值
273+
* @param <E> 枚举类型
274+
* @param <C> 字段类型
275+
* @return 对应枚举 ,获取不到时为 {@code null}
276+
*/
277+
public static <E extends Enum<E>, C> E getBy(Class<E> enumClass, Func1<E, C> condition, C value) {
278+
if (null == condition) {
279+
return null;
280+
}
281+
return getBy(enumClass, constant -> ObjUtil.equals(condition.callWithRuntimeException(constant), value));
282+
}
283+
284+
/**
285+
* 通过 某字段对应值 获取 枚举,获取不到时为 {@code defaultEnum}
286+
*
287+
* @param enumClass 枚举类, 为{@code null}返回{@code null}
288+
* @param condition 条件字段,为{@code null}返回{@code null}
289+
* @param value 条件字段值
290+
* @param defaultEnum 获取不到时的默认枚举值
291+
* @param <E> 枚举类型
292+
* @param <C> 字段类型
293+
* @return 对应枚举 ,获取不到时为 {@code defaultEnum}
294+
*/
295+
public static <E extends Enum<E>, C> E getBy(Class<E> enumClass, Func1<E, C> condition, C value, E defaultEnum) {
296+
return ObjectUtil.defaultIfNull(getBy(enumClass, condition, value), defaultEnum);
246297
}
247298

248299
/**
@@ -259,10 +310,7 @@ public static <E extends Enum<E>, C> E getBy(Func1<E, C> condition, C value) {
259310
return null;
260311
}
261312
final Class<E> implClass = LambdaUtil.getRealClass(condition);
262-
return Arrays.stream(implClass.getEnumConstants())
263-
.filter(constant -> ObjUtil.equals(condition.callWithRuntimeException(constant), value))
264-
.findAny()
265-
.orElse(null);
313+
return getBy(implClass, condition, value);
266314
}
267315

268316
/**
@@ -293,7 +341,7 @@ public static <E extends Enum<E>, C> E getBy(Func1<E, C> condition, C value, E d
293341
* @since 5.8.0
294342
*/
295343
public static <E extends Enum<E>, F, C> F getFieldBy(Func1<E, F> field, Function<E, C> condition, C value) {
296-
if(null == field || null == condition){
344+
if (null == field || null == condition) {
297345
return null;
298346
}
299347
final Class<E> implClass = LambdaUtil.getRealClass(field);
@@ -316,7 +364,7 @@ public static <E extends Enum<E>, F, C> F getFieldBy(Func1<E, F> field, Function
316364
* @since 4.0.2
317365
*/
318366
public static <E extends Enum<E>> LinkedHashMap<String, E> getEnumMap(final Class<E> enumClass) {
319-
if(null == enumClass){
367+
if (null == enumClass) {
320368
return null;
321369
}
322370
final LinkedHashMap<String, E> map = new LinkedHashMap<>();
@@ -335,7 +383,7 @@ public static <E extends Enum<E>> LinkedHashMap<String, E> getEnumMap(final Clas
335383
* @return 枚举名对应指定字段值的Map
336384
*/
337385
public static Map<String, Object> getNameFieldMap(Class<? extends Enum<?>> clazz, String fieldName) {
338-
if(null == clazz || StrUtil.isBlank(fieldName)){
386+
if (null == clazz || StrUtil.isBlank(fieldName)) {
339387
return null;
340388
}
341389
final Enum<?>[] enums = clazz.getEnumConstants();
@@ -359,7 +407,7 @@ public static Map<String, Object> getNameFieldMap(Class<? extends Enum<?>> clazz
359407
*/
360408
public static <E extends Enum<E>> boolean contains(final Class<E> enumClass, String val) {
361409
final LinkedHashMap<String, E> enumMap = getEnumMap(enumClass);
362-
if(CollUtil.isEmpty(enumMap)){
410+
if (CollUtil.isEmpty(enumMap)) {
363411
return false;
364412
}
365413
return enumMap.containsKey(val);

0 commit comments

Comments
 (0)