(Java) 是否可以让函数 return 成为运算符?
(Java) Is it possible to have a function return an operator?
我想知道是否可以 return 运算符就好像它是对象或类型一样。
这将用于解析二维坐标数组以确定两个多边形重叠位置的边界框。该函数的输出将确定 for 循环的布尔语句,因此算法可以根据多边形的运动方向从多边形的背面开始解析。
public <operator> function(int value){
if(value < 0) {
return >=;
}
return <=;
}
上面的语法显然是完全错误的,但我正在寻找类似的东西。
我想像这样使用函数:
if(var1 function(value) var2)
有这样的东西吗?如果不是,是否有其他方法可以在 >= 和 <= 之间切换?
很遗憾,您不能 return 操作员。根据JLS关于:
return Expression
opt
;
The Expression must denote a variable or value of some type T, or a compile-time error occurs.
由于运算符不是变量或值,因此您不能 return 它。
为什么不直接让方法进行比较:
public boolean function(int value, int num1, int num2){
if(value < 0) {
return num1 >= num2;
}
return num1 <= num2;
}
然后将其命名为:
if(function(value, var1, var2))
你可以return一个BiPredicate
:
public BiPredicate<Integer, Integer> function(int value) {
if(value < 0) {
return (a, b) -> a >= b;
}
return (a, b) -> a <= b;
}
可以使用Java8.
的功能接口
因为你想要 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))
我想知道是否可以 return 运算符就好像它是对象或类型一样。
这将用于解析二维坐标数组以确定两个多边形重叠位置的边界框。该函数的输出将确定 for 循环的布尔语句,因此算法可以根据多边形的运动方向从多边形的背面开始解析。
public <operator> function(int value){
if(value < 0) {
return >=;
}
return <=;
}
上面的语法显然是完全错误的,但我正在寻找类似的东西。
我想像这样使用函数:
if(var1 function(value) var2)
有这样的东西吗?如果不是,是否有其他方法可以在 >= 和 <= 之间切换?
很遗憾,您不能 return 操作员。根据JLS关于:
return Expression
opt
;
The Expression must denote a variable or value of some type T, or a compile-time error occurs.
由于运算符不是变量或值,因此您不能 return 它。
为什么不直接让方法进行比较:
public boolean function(int value, int num1, int num2){
if(value < 0) {
return num1 >= num2;
}
return num1 <= num2;
}
然后将其命名为:
if(function(value, var1, var2))
你可以return一个BiPredicate
:
public BiPredicate<Integer, Integer> function(int value) {
if(value < 0) {
return (a, b) -> a >= b;
}
return (a, b) -> a <= b;
}
可以使用Java8.
的功能接口因为你想要 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))