(Java)是否可以让函数返回运算符?

时间:2019-05-10 23:01:38

标签: java operators

我想知道是否有可能像一个对象或类型一样返回一个运算符。

这将用于解析2D坐标数组以确定两个多边形重叠的边界框。函数的输出将确定for循环的布尔语句,因此算法可以根据多边形的运动方向从多边形的背面开始解析。

public <operator> function(int value){
    if(value < 0) {
        return >=;
    }
    return <=;
}

上面的语法显然是完全错误的,但是我正在寻找相似的东西。

我想与此类似地使用该功能:

if(var1 function(value) var2)

这样的东西还存在吗?如果没有,还有其他方法可以在> =和<=之间进行切换吗?

3 个答案:

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