我想知道是否有可能像一个对象或类型一样返回一个运算符。
这将用于解析2D坐标数组以确定两个多边形重叠的边界框。函数的输出将确定for循环的布尔语句,因此算法可以根据多边形的运动方向从多边形的背面开始解析。
public <operator> function(int value){
if(value < 0) {
return >=;
}
return <=;
}
上面的语法显然是完全错误的,但是我正在寻找相似的东西。
我想与此类似地使用该功能:
if(var1 function(value) var2)
这样的东西还存在吗?如果没有,还有其他方法可以在> =和<=之间进行切换吗?
答案 0 :(得分:2)
不幸的是,您不能返回操作符。根据{{3}}关于:
return Expression
opt
;
表达式必须表示某个类型T的变量或值,否则会发生编译时错误。
由于运算符不是变量或值,因此无法返回它。
为什么不只有该方法进行比较:
public boolean function(int value, int num1, int num2){
if(value < 0) {
return num1 >= num2;
}
return num1 <= num2;
}
然后将其称为:
if(function(value, var1, var2))
答案 1 :(得分:1)
您可以返回BiPredicate
:
public BiPredicate<Integer, Integer> function(int value) {
if(value < 0) {
return (a, b) -> a >= b;
}
return (a, b) -> a <= b;
}
答案 2 :(得分:1)
您可以使用Java 8的功能接口。
由于您需要2个操作数和一个布尔结果,因此您可以简单地使用BiPredicate
,但是由于您希望2个操作数具有相同的类型,因此需要重复该类型,因此您可以创建一个新的功能界面,例如名为BinaryPredicate
:
interface BinaryPredicate<T> extends BiPredicate<T, T> {
// nothing to add
}
那么您的方法可能是这样,如果您希望操作数是实现Comparable
的类型:
public static <T extends Comparable<T>> BinaryPredicate<T> objectOperator(int value){
if (value < 0)
return (a, b) -> a.compareTo(b) >= 0;
return (a, b) -> a.compareTo(b) <= 0;
}
如果您希望操作数为int
值,则可以创建此值:
interface IntBinaryPredicate {
boolean test(int a, int b);
}
然后按照以下方法进行操作:
public static IntBinaryPredicate intOperator(int value){
if (value < 0)
return (a, b) -> a >= b;
return (a, b) -> a <= b;
}
这是您将如何使用它们:
BinaryPredicate<String> stringOp = objectOperator(1);
if (stringOp.test("Foo", "Bar"))
IntBinaryPredicate intOp = intOperator(1);
if (intOp.test(13, 42))