Java8 FunctionalInterface

Aru*_*unM 6 java generics lambda java-8 java-stream

public static <E extends Enum<E>> boolean validateEnum(Class<E> clazz, String s) {
    return EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));
}
Run Code Online (Sandbox Code Playgroud)

以下是上述方法的示例调用

boolean isValid = validateEnum(Animal.class, "DOG");
boolean isValid = validateEnum(Color.class, "Red");
Run Code Online (Sandbox Code Playgroud)

可以使用Java 8实现相同的功能FunctionalInterface.我试过创建一个BiPredicate但是在编译错误时尝试了这个.

final BiPredicate<String,Class> biPre = (string1, clazz) -> EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));
Run Code Online (Sandbox Code Playgroud)

Rav*_*ala 7

这是一种方法,

final BiPredicate<String, ? super Enum<?>> biPre = (string1, enumType) -> EnumSet
        .allOf(enumType.getDeclaringClass()).stream().anyMatch(e -> e.name().equals(string1));
Run Code Online (Sandbox Code Playgroud)

这是客户端代码,

boolean test = biPre.test("DOG", Animal.CAT);
Run Code Online (Sandbox Code Playgroud)

然而,传递枚举常量而不是类文字似乎有点尴尬.

如果你真的需要在这里使用类型令牌,你应该做什么,

final BiPredicate<String, Class<? extends Enum<?>>> biPre = (string1, clazz) -> Arrays
    .stream(clazz.getEnumConstants()).anyMatch(e -> e.name().equals(string1));
Run Code Online (Sandbox Code Playgroud)

客户现在看起来像这样,

boolean test = biPre.test("DOG", Animal.class);
Run Code Online (Sandbox Code Playgroud)