谓词“是如何决定的?”;及;方法在java中会有消费者而不是生产者?

谓词“是如何决定的?”;及;方法在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或其子类,因此它

我正在浏览Java8中引入的谓词类,它是函数接口。 谓词类中有一个方法和,如下所示,用于将多个谓词组合成一个谓词

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