
com.daiyc.extension.adaptive.matcher.EnumMatcher Maven / Gradle / Ivy
package com.daiyc.extension.adaptive.matcher;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author daiyc
* @since 2024/12/14
*/
@Getter
@RequiredArgsConstructor
public abstract class EnumMatcher> implements Matcher {
protected final Class enumType;
@Override
public String match(T t) {
E e = getEnum(t);
return e == null ? null : e.name();
}
protected abstract E getEnum(T t);
public static > EnumMatcher byOrdinal(Class enumType) {
return new EnumOrdinalMatcher<>(enumType);
}
public static , T> EnumMatcher byField(Class enumType, Function getter) {
return new EnumFieldMatcher<>(enumType, getter);
}
public static , T> EnumMatcher byMethod(Class enumType, Function fn) {
return new EnumMethodMatcher<>(enumType, fn);
}
public static class EnumOrdinalMatcher> extends EnumMatcher {
public EnumOrdinalMatcher(Class enumType) {
super(enumType);
}
@Override
public E getEnum(Integer ordinal) {
if (ordinal == null || ordinal < 0 || ordinal >= enumType.getEnumConstants().length) {
return null;
}
return enumType.getEnumConstants()[ordinal];
}
}
public static class EnumFieldMatcher, T> extends EnumMatcher {
private final Map map;
public EnumFieldMatcher(Class enumType, Function getter) {
super(enumType);
map = Arrays.stream(enumType.getEnumConstants())
.collect(Collectors.toMap(getter, Function.identity()));
}
@Override
protected E getEnum(T t) {
return map.get(t);
}
}
public static class EnumMethodMatcher, V> extends EnumMatcher {
private final Function function;
public EnumMethodMatcher(Class enumType, Function function) {
super(enumType);
this.function = function;
}
@Override
protected E getEnum(V v) {
return function.apply(v);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy