Java как сравнивать предикаты - PullRequest
0 голосов
/ 13 июля 2020

У меня есть два prodicates:

Predicate<CategoryModel> predicate1 = NavigationCategoryModel.class::isInstance;
Predicate<CategoryModel> predicate2 = BrandCategoryModel.class::isInstance;

With и if, как я могу определить, какой предикат я использую? Я пытаюсь сделать что-то подобное, но, очевидно, не компилируется:

if(predicate1.equals(NavigationCategoryModel.class::isInstance)){
}

if(predicate1==NavigationCategoryModel.class::isInstance){
}

Есть подсказка? Я новичок в Java 8 лямбдах

Это код Pojos (простое наследование для тестовых целей):

public class CategoryModel {
}

public class NavigationCategoryModel  extends CategoryModel{
}

public class BrandCategoryModel extends CategoryModel {
}

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Вы пытаетесь найти, какую реализацию вы используете.

Единственный способ - использовать функцию test из Predicate.

true if the input argument matches the predicate, otherwise false
public static void main(String args[]) {

    Predicate<CategoryModel> predicate1 = NavigationCategoryModel.class::isInstance;
    Predicate<CategoryModel> predicate2 = BrandCategoryModel.class::isInstance;

    System.out.println("Predicate1 isNavigation: " + isNavigation(predicate1));
    System.out.println("Predicate1 isBrand: " + isBrand(predicate1));
    System.out.println("--------------------------------------------------");
    System.out.println("Predicate2 isNavigation: " + isNavigation(predicate2));
    System.out.println("Predicate2 isBrand: " + isBrand(predicate2));

}

public static boolean isNavigation(Predicate<CategoryModel> predicate){

    return predicate.test(new NavigationCategoryModel());

}

public static boolean isBrand(Predicate<CategoryModel> predicate){

    return predicate.test(new BrandCategoryModel());

}
1 голос
/ 13 июля 2020

Так же, как решение KunLun, но я думаю, вам следует добавить еще одно условие, например

Predicate<CategoryModel> predicate1 = NavigationCategoryModel.class::isInstance;
Predicate<CategoryModel> predicate2 = BrandCategoryModel.class::isInstance;

Predicate<CategoryModel> predicate1Testing = NavigationCategoryModel.class::isInstance;

System.out.println("Is A NavigationCategoryModel Predicate? " + predicate1.and(predicate1Testing).test(new NavigationCategoryModel()));
1 голос
/ 13 июля 2020

Вы должны использовать метод test для предикатов. И вы должны предоставить объект для выполнения проверки вместо фактической ссылки на метод

predicate.test(object)

Документация: Predicate # test

Для вашей проблемы вы можете протестировать if predicate1 возвращает true, когда объект имеет тип NavigationCategoryModel, как показано ниже:

predicate1.test(new NavigationCategoryModel()) // returns true

Аналогично, для BrandCategoryModel используйте:

predicate2.test(new BrandCategoryModel()) // returns true

Если вы хотите проверить соответствие этого объекта любой из двух, вы можете объединить оба предиката, например:

predicate1.or(predicate2).test(new NavigationCategoryModel()) // returns true
predicate1.or(predicate2).test(new BrandCategoryModel()) // returns true
...