【问题标题】:How to define custom combine predicate?如何定义自定义组合谓词?
【发布时间】:2020-06-02 12:25:51
【问题描述】:

我定义了自己的谓词:

public interface StringPredicate extends Predicate<String> {

它有效,但如果我写:

myPred.and( strEl -> strEl != null);

结果是Predicate&lt;String&gt; 而不是StringPredicate。如何也定义组合操作?

【问题讨论】:

    标签: java java-8 predicate


    【解决方案1】:

    您可以在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&lt;? super String&gt; other) 之类的方法有几个优点……
    • @Holger,说得好。声明StringPredicate 有什么好处?
    • @HadiJ 我不知道为什么 OP 想要 StringPredicate,但另一方面,我也不知道 JDK 开发人员为什么要添加,例如UnaryOperator&lt;T&gt; 而不是使用Function&lt;T,T&gt;,因为如果使用andThencomposeUnaryOperator 会出现完全相同的问题...
    • 我有自己的对象字符串只是一个例子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多