首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8 FunctionalInterface

Java8 FunctionalInterface
EN

Stack Overflow用户
提问于 2019-01-22 11:15:23
回答 2查看 236关注 0票数 5
代码语言:javascript
复制
public static <E extends Enum<E>> boolean validateEnum(Class<E> clazz, String s) {
    return EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));
}

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

代码语言:javascript
复制
boolean isValid = validateEnum(Animal.class, "DOG");
boolean isValid = validateEnum(Color.class, "Red");

可以使用Java8 FunctionalInterface实现相同的功能吗?我曾尝试创建一个BiPredicate,但在尝试此操作时遇到编译器错误。

代码语言:javascript
复制
final BiPredicate<String,Class> biPre = (string1, clazz) -> EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-22 12:55:00

这里有一种方法,

代码语言:javascript
复制
final BiPredicate<String, ? super Enum<?>> biPre = (string1, enumType) -> EnumSet
        .allOf(enumType.getDeclaringClass()).stream().anyMatch(e -> e.name().equals(string1));

这是客户端代码,

代码语言:javascript
复制
boolean test = biPre.test("DOG", Animal.CAT);

然而,在这里传递枚举常量而不是类文字似乎有点笨拙。

如果你真的需要使用类型token,下面是你应该做的,

代码语言:javascript
复制
final BiPredicate<String, Class<? extends Enum<?>>> biPre = (string1, clazz) -> Arrays
    .stream(clazz.getEnumConstants()).anyMatch(e -> e.name().equals(string1));

客户端现在看起来是这样的,

代码语言:javascript
复制
boolean test = biPre.test("DOG", Animal.class);
票数 6
EN

Stack Overflow用户

发布于 2019-01-22 13:02:47

您必须将定义了biPre的类声明为泛型,类似于函数validateEnum

代码语言:javascript
复制
public class Test<E extends Enum<E>> {
    BiPredicate<String,Class<E>> biPre = (string1,clazz) -> EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(string1));
}

然后您可以像这样测试它:

代码语言:javascript
复制
boolean isValid = biPre.test( "DOG", (Class<E>) Animal.class);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54300764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档