Java8 FunctionalInterface

时间:2019-01-22 03:15:23

标签: 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));
}

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

boolean isValid = validateEnum(Animal.class, "DOG");
boolean isValid = validateEnum(Color.class, "Red");

可以使用Java 8 FunctionalInterface实现相同的功能。我尝试创建BiPredicate,但尝试此操作时遇到编译器错误。

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

2 个答案:

答案 0 :(得分:6)

这是一种实现方式,

constructor(props) {
  super(props);
  this.state = getUserData();
}
updateUsername(username) {
  this.setState({ username });
  setUserData({ username }); // Assuming this one
}

这是客户端代码,

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);

客户端现在看起来像这样

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

答案 1 :(得分:2)

您必须声明将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);