谓词“是如何决定的?”;及;方法在java中会有消费者而不是生产者?
我正在浏览Java8中引入的谓词类,它是函数接口。 谓词类中有一个方法和,如下所示,用于将多个谓词组合成一个谓词谓词“是如何决定的?”;及;方法在java中会有消费者而不是生产者?,java,lambda,java-8,functional-programming,pecs,Java,Lambda,Java 8,Functional Programming,Pecs,我正在浏览Java8中引入的谓词类,它是函数接口。 谓词类中有一个方法和,如下所示,用于将多个谓词组合成一个谓词 default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) && other.test(t); } Producer-通过返回对象给您: 对象必须是T或其子类,因此它
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
Producer-通过返回对象给您:
对象必须是
T
或其子类,因此它扩展了
消费者-将您的对象作为方法参数:该方法可以采用更通用的类型,但不能要求更具体的类型,因此参数可以是
super
由于谓词方法将对象作为参数,因此它是使用者
参考:谓词
s接受一个T
,并给你一个布尔值
。是的,它是boolean
s的生产者,但这在这里并不重要。对类型参数应用PEC时,应考虑该类型是该类型参数的生产者还是消费者
由于谓词
接受T
,它是T
的消费者,所以它应该是?super
用于T
参数
另一个例子:BiFunction
接受T
和U
,并产生V
,因此它是T
的消费者、U
的消费者和V
的生产者。因此,?超级用于T
和U
,?为V
扩展。如您所见,只有类型参数才重要。该类型可能执行的任何其他操作都不会执行
如果翻转两侧-predit.和(pred)
,将允许使用这些行,这将创建一个谓词
这是因为和
被声明为生成与其被调用的谓词类型相同的谓词,因此pred.和(…)
只能生成一个谓词
,但是谓词
在这里没有意义-另一个连接只能接受整数
你完全可以让它在两种顺序下都工作。如果将和声明为静态方法:
public static <T> Predicate<T> and(Predicate<? super T> a, Predicate<? super T> b)
但是这样读起来就不那么容易了:(
Predicate<Number> pred = n -> n.intValue() > 2;
Predicate<Integer> predInt = n -> n > 3;
//Compile error
//pred.and(predInt);
但以下代码(如果要编译)在运行时会失败:
Number n = Double.valueOf(100);
System.out.println(pred.and(predInt).test(n));
由于引入泛型正是为了防止此类运行时故障,因此必须防止代码编译(即产生编译错误).目标是创建一个谓词
,它可以为T
类型的对象决定某些东西。一个处理T
超类的谓词也可以为T
决定某些东西。例如,假设你为狗创建一个谓词,谓词
,然后你想将它与一个谓词组合起来t处理动物
s,谓词
,例如,可以决定动物是否超过10岁的谓词。这样的谓词也可以用于狗。因此,当一般的动物谓词也起作用时,不必仅限于狗的谓词。@Zabuzard注释相当于我的ans谢谢如果我没弄错的话,OP知道所有这些,并且特别询问PEC的术语(见他的问题和评论部分的细节)。
Predicate<Number> pred = n -> n.intValue() > 2;
Predicate<Integer> predInt = n -> n > 3;
//Compile error
//pred.and(predInt);
Number n = Double.valueOf(100);
System.out.println(pred.test(n));
Number n = Double.valueOf(100);
System.out.println(pred.and(predInt).test(n));