Java 8中的超类String和Integer

Spi*_*ico 0 java lambda apache-spark

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

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 
}
Run Code Online (Sandbox Code Playgroud)

我希望这个函数适用于Integers,Floats和Strings.因此,不是编写两个相同的谓词函数,一个用于字符串,一个用于Integer + Float,我想写一个,因为compareTo()方法适用于所有3个.我想我可以通过替换 Predicate<String>来实现Predicate<Super class of Integer/Float/String>.我试过Object但是没用.那么,我应该放什么而不<String>是以我想要的方式使用该功能?

ken*_*ytm 6

有没有共同的"父" IntegerString不是其他Object,因为它不具备这是你没用compareTo.

但是两者之间有一个共同的接口 - Comparable<T>提供了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(从Java 7开始,你可以打开字符串,所以在这里使用if/else链是没有意义的.但在你的情况下,enum op甚至可能更合适.)