【发布时间】:2020-06-02 12:25:51
【问题描述】:
我定义了自己的谓词:
public interface StringPredicate extends Predicate<String> {
它有效,但如果我写:
myPred.and( strEl -> strEl != null);
结果是Predicate<String> 而不是StringPredicate。如何也定义组合操作?
【问题讨论】:
我定义了自己的谓词:
public interface StringPredicate extends Predicate<String> {
它有效,但如果我写:
myPred.and( strEl -> strEl != null);
结果是Predicate<String> 而不是StringPredicate。如何也定义组合操作?
【问题讨论】:
您可以在StringPredicate 接口中定义自己的and 方法:
public interface StringPredicate extends Predicate<String> {
default StringPredicate and(StringPredicate other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
}
现在,以下将起作用:
StringPredicate myPred = s -> s.length() > 0;
StringPredicate combined = myPred.and(strEl -> strEl.length () < 5);
【讨论】:
other 没有必要成为StringPredicate。改为声明 @Override default StringPredicate and(Predicate<? super String> other) 之类的方法有几个优点……
StringPredicate 有什么好处?
StringPredicate,但另一方面,我也不知道 JDK 开发人员为什么要添加,例如UnaryOperator<T> 而不是使用Function<T,T>,因为如果使用andThen 或compose,UnaryOperator 会出现完全相同的问题...