(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 Expressionopt;

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))