Java 8中字符串和整数的超类

Java 8中字符串和整数的超类,java,apache-spark,lambda,Java,Apache Spark,Lambda,我正在编写一个简单的谓词函数,如下所示: public static Predicate<String> stringPredicate(String op, String compVal) { if (op.equals("=")){ return p -> p.compareTo(compVal) == 0; } else if (op.equals("<")){ return p -> p.compare

我正在编写一个简单的谓词函数,如下所示:

public static Predicate<String> stringPredicate(String op, String compVal) {
    if (op.equals("=")){
        return p -> p.compareTo(compVal) == 0;
    }
    else if (op.equals("<")){
        return p -> p.compareTo(compVal) == -1;
    }
    else if (op.equals("<=")){
        return p -> p.compareTo(compVal) == 0 || p.compareTo(compVal) == -1;
    }
    else if (op.equals(">")){
        return p -> p.compareTo(compVal) == 1;
    }
    else if (op.equals(">=")){
        return p -> p.compareTo(compVal) == 1 || p.compareTo(compVal) == 0;
    }
    return p -> -1 == 0; //return false 
}
公共静态谓词stringPredicate(字符串op,字符串compVal){
如果(op.equals(“=”)){
返回p->p.compareTo(compVal)==0;
}
else if(op.equals(“”){
返回p->p.compareTo(compVal)==1;
}
else if(op.equals(“>=”){
返回p->p.compareTo(compVal)==1 | | p.compareTo(compVal)==0;
}
返回p->-1==0;//返回false
}
我希望这个函数同时适用于整数、浮点和字符串。因此,与其编写两个相同的谓词函数,一个用于字符串,另一个用于整数+浮点,不如编写一个,因为compareTo()方法适用于所有3个谓词函数。我想我可以通过替换
谓词
谓词
。我尝试了
对象
,但没有成功。那么,我应该用什么来代替
以我想要的方式使用函数呢?

除了
对象
,没有
整数
字符串
的共同“超类”,因为它没有
比较

但两者之间有一个共同的接口,它提供了
compareTo
方法

public static <T extends Comparable<T>> Predicate<T> predicate(String op, T compVal) {
    switch (op) {
        case "=": return p -> p.compareTo(compVal) == 0;
        case "<": return p -> p.compareTo(compVal) < 0;
        case "<=": return p -> p.compareTo(compVal) <= 0;
        case ">": return p -> p.compareTo(compVal) > 0;
        case ">=": return p -> p.compareTo(compVal) >= 0;
        default: return p -> false;
    }
}
公共静态谓词(字符串op,T compVal){
开关(op){
案例“=”:返回p->p.compareTo(compVal)=0;
案例“”:返回p->p.compareTo(compVal)>0;
案例“>=”:返回p->p.compareTo(compVal)>=0;
默认值:返回p->false;
}
}

(从Java 7开始,您可以这样做,所以在这里使用if/else链没有意义。但是在您的情况下。)

我不明白您的意思?我想知道还有没有别的,是不是?我错过了什么吗?@SpiderRico
等于
=
相比。啊,我现在明白了,是的。但就正确性而言,这不会有太大改变,对吗?@SpiderRico是的,它会:@SpiderRico取决于您所指的“正确性”。谢谢。这正是我所需要的。考虑基于<代码> map x.Cabaseto(y)> 0)< /代码>等。然后,代码>返回p>函数映射。获取(OP)。应用(p,CopVar)< /代码>。或者使用枚举而不是映射。@如果只是将
开关
移动到
映射
,您仍然需要复制相同数量的代码。我不知道这将如何改善任何事情:)