public static <E extends Enum<E>> boolean validateEnum(Class<E> clazz, String s) {
return EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));
}下面是上述方法的调用示例
boolean isValid = validateEnum(Animal.class, "DOG");
boolean isValid = validateEnum(Color.class, "Red");可以使用Java8 FunctionalInterface实现相同的功能吗?我曾尝试创建一个BiPredicate,但在尝试此操作时遇到编译器错误。
final BiPredicate<String,Class> biPre = (string1, clazz) -> EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));发布于 2019-01-22 12:55:00
这里有一种方法,
final BiPredicate<String, ? super Enum<?>> biPre = (string1, enumType) -> EnumSet
.allOf(enumType.getDeclaringClass()).stream().anyMatch(e -> e.name().equals(string1));这是客户端代码,
boolean test = biPre.test("DOG", Animal.CAT);然而,在这里传递枚举常量而不是类文字似乎有点笨拙。
如果你真的需要使用类型token,下面是你应该做的,
final BiPredicate<String, Class<? extends Enum<?>>> biPre = (string1, clazz) -> Arrays
.stream(clazz.getEnumConstants()).anyMatch(e -> e.name().equals(string1));客户端现在看起来是这样的,
boolean test = biPre.test("DOG", Animal.class);发布于 2019-01-22 13:02:47
您必须将定义了biPre的类声明为泛型,类似于函数validateEnum。
public class Test<E extends Enum<E>> {
BiPredicate<String,Class<E>> biPre = (string1,clazz) -> EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(string1));
}然后您可以像这样测试它:
boolean isValid = biPre.test( "DOG", (Class<E>) Animal.class);https://stackoverflow.com/questions/54300764
复制相似问题