!1283 添加 EnumUtil#getBy(Class, Func1, Object)方法,最终的条件过滤统一使用 EnumUtil#getBy(Class, Predicate, Enum) 方法

Merge pull request !1283 from 罗敬/v5-dev
This commit is contained in:
Looly 2024-12-15 14:39:41 +00:00 committed by Gitee
commit 603b7aa870
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F

View File

@ -238,11 +238,62 @@ public class EnumUtil {
* @since 5.8.0
*/
public static <E extends Enum<E>> E getBy(Class<E> enumClass, Predicate<? super E> predicate) {
return getBy(enumClass, predicate, null);
}
/**
* 通过 某字段对应值 获取 枚举获取不到时为 {@code defaultEnum}
*
* @param enumClass 枚举类
* @param predicate 条件
* @param defaultEnum 获取不到时的默认枚举值
* @param <E> 枚举类型
* @return 对应枚举 获取不到时为 {@code defaultEnum}
*/
public static <E extends Enum<E>> E getBy(Class<E> enumClass, Predicate<? super E> predicate, E defaultEnum) {
if (null == enumClass || null == predicate) {
return null;
}
return Arrays.stream(enumClass.getEnumConstants())
.filter(predicate).findFirst().orElse(null);
.filter(predicate).findFirst().orElse(defaultEnum);
}
/**
* 通过 某字段对应值 获取 枚举获取不到时为 {@code null}
* <p/>
* {@link LambdaUtil#getRealClass(Func1)}} 是相对耗时的
* 如果枚举值比较多,那么{@link EnumUtil#getBy(Func1, Object)} 方法
* 大部分时间都是被{@link LambdaUtil#getRealClass(Func1)}}所消耗的
* <br/>
* 如果可以在编码过程中可以提供对应的枚举类 该方法与枚举的{@code Enum.values()}方法是差不多的
*
* @param enumClass 枚举类 {@code null}返回{@code null}
* @param condition 条件字段{@code null}返回{@code null}
* @param value 条件字段值
* @param <E> 枚举类型
* @param <C> 字段类型
* @return 对应枚举 获取不到时为 {@code null}
*/
public static <E extends Enum<E>, C> E getBy(Class<E> enumClass, Func1<E, C> condition, C value) {
if (null == condition) {
return null;
}
return getBy(enumClass, constant -> ObjUtil.equals(condition.callWithRuntimeException(constant), value));
}
/**
* 通过 某字段对应值 获取 枚举获取不到时为 {@code defaultEnum}
*
* @param enumClass 枚举类 {@code null}返回{@code null}
* @param condition 条件字段{@code null}返回{@code null}
* @param value 条件字段值
* @param defaultEnum 获取不到时的默认枚举值
* @param <E> 枚举类型
* @param <C> 字段类型
* @return 对应枚举 获取不到时为 {@code defaultEnum}
*/
public static <E extends Enum<E>, C> E getBy(Class<E> enumClass, Func1<E, C> condition, C value, E defaultEnum) {
return ObjectUtil.defaultIfNull(getBy(enumClass, condition, value), defaultEnum);
}
/**
@ -259,10 +310,7 @@ public class EnumUtil {
return null;
}
final Class<E> implClass = LambdaUtil.getRealClass(condition);
return Arrays.stream(implClass.getEnumConstants())
.filter(constant -> ObjUtil.equals(condition.callWithRuntimeException(constant), value))
.findAny()
.orElse(null);
return getBy(implClass, condition, value);
}
/**