(Java) Можно ли заставить функцию возвращать оператор? - PullRequest
1 голос
/ 11 мая 2019

Я хочу знать, возможно ли вернуть оператор, как если бы он был объектом или типом.

Это было бы для анализа двумерного массива координат, чтобы определить ограничивающую рамку, где находятся два многоугольника.перекрытия.Выходные данные функции будут определять логическое выражение для циклов for, поэтому алгоритм может начать его синтаксический анализ с задней стороны многоугольника, основываясь на направлении движения многоугольника.

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

Синтаксис выше, очевидно, полностьюнеправильно, но я оптимально искал что-то похожее.

Я бы хотел использовать функцию, подобную этой:

if(var1 function(value) var2)

Существует ли что-нибудь подобное?Если нет, есть ли другой способ переключения между> = и <=? </p>

Ответы [ 3 ]

2 голосов
/ 11 мая 2019

К сожалению нет, вы не можете вернуть оператора.Согласно JLS в отношении:

return Expressionopt;

Выражение должно обозначать переменнуюили значение некоторого типа 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 голос
/ 11 мая 2019

Вы можете использовать функциональные интерфейсы 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))
1 голос
/ 11 мая 2019

Вы можете вернуть BiPredicate:

public BiPredicate<Integer, Integer> function(int value) {
    if(value < 0) {
        return (a, b) -> a >= b;
    }
    return (a, b) -> a <= b;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...