Java如何比较谓词

Java如何比较谓词,java,java-8,compare,java-stream,predicate,Java,Java 8,Compare,Java Stream,Predicate,我有两个产品: Predicate<CategoryModel> predicate1 = NavigationCategoryModel.class::isInstance; Predicate<CategoryModel> predicate2 = BrandCategoryModel.class::isInstance; 有什么提示吗?我对Java8Lambdas很陌生 这是POJO(用于测试的简单继承)的代码: 您应该对谓词使用test方法。而且,您必须提供执行

我有两个产品:

Predicate<CategoryModel> predicate1 = NavigationCategoryModel.class::isInstance;
Predicate<CategoryModel> predicate2 = BrandCategoryModel.class::isInstance;
有什么提示吗?我对Java8Lambdas很陌生

这是POJO(用于测试的简单继承)的代码:


您应该对谓词使用
test
方法。而且,您必须提供执行验证的对象,而不是实际的方法引用

predicate.test(object)
文件:

对于您的问题,当对象的类型为
NavigationCategoryModel
时,您可以测试predicate1是否返回true,如下所示:

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

您尝试的是找到您使用的实现

唯一的方法是使用
谓词
中的函数
测试

true if the input argument matches the predicate, otherwise false
publicstaticvoidmain(字符串参数[]){
谓词谓词1=NavigationCategoryModel.class::isInstance;
谓词谓词谓词2=BrandCategoryModel.class::isInstance;
System.out.println(“谓词1 isNavigation:+isNavigation(谓词1));
System.out.println(“谓词1 isBrand:+isBrand(谓词1));
System.out.println(“-------------------------------------------------------------”;
System.out.println(“predicate2isnavigation:+isNavigation(Predicate2));
System.out.println(“predicate2isbrand:+isBrand(Predicate2));
}
公共静态布尔isNavigation(谓词){
return predicate.test(new NavigationCategoryModel());
}
公共静态布尔值isBrand(谓词谓词){
返回谓词.test(新的BrandCategoryModel());
}

就像昆仑的解决方案一样,但我认为您应该再添加一个条件,例如

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=NavigationCategoryModel.class::isInstance;
谓词谓词谓词2=BrandCategoryModel.class::isInstance;
谓词predicate1Testing=NavigationCategoryModel.class::isInstance;
System.out.println(“是NavigationCategoryModel谓词吗?”+predicate1.and(predicate1Testing).test(new NavigationCategoryModel());

你到底想在他们身上比较什么?如果它们是同一类型的对象?听起来像是XY问题。你为什么需要这个?我想比较一下他们是使用NavigationCategoryModel还是BrandCategoryModel的谓词。我需要知道当你用语义等价的
谓词谓词1=new谓词()替换声明时,isInstance类使用的是哪一个{return o instanceof NavigationCategoryModel;}};
,是否有任何方法可以发现它正在测试
instanceof NavigationCategoryModel
?您是否期望
谓词1.equals(新谓词(){public boolean test(CategoryModel o){return o instanceof NavigationCategoryModel;})
要计算为
true
?是否有任何理由假设lambda表达式或方法引用的行为不同?我不明白。
predicate1
predicate1Testing
之间有什么区别?不确定为什么用一个扩展另一个会有好处。嗨@Scratte,predicate1Testing可能不同在这个问题中,作者想知道哪个谓词在使用?谓词1测试是与原始谓词进行比较的输入。
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());

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