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>是以我想要的方式使用该功能?
有没有共同的"父" Integer和String不是其他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甚至可能更合适.)
| 归档时间: |
|
| 查看次数: |
470 次 |
| 最近记录: |