Java8 FunctionalInterface - PullRequest
       18

Java8 FunctionalInterface

0 голосов
/ 22 января 2019
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 голосов
/ 22 января 2019

Вы должны объявить класс, в котором 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);
0 голосов
/ 22 января 2019

Вот один из способов сделать это,

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

Клиент теперь выглядит так,

boolean test = biPre.test("DOG", Animal.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...