Что вам нужно, это не во время выполнения метапрограммирования, но первые функций класса.
Следующие представляют собой функции первого класса с arity 1 и 2 соответственно.
abstract class UnaryFunction<A, B> {
public abstract B apply(A a);
}
abstract class BinaryFunction<A, B, C> {
public abstract C apply(A a, B b);
}
Для простоты давайте использовать специализированные версии вышеуказанных классов.
abstract class UnaryOperation {
public abstract int apply(int a);
}
abstract class BinaryOperation {
public abstract int apply(int a, int b);
}
Теперь создайте словарь требуемых арифметических операций.
Map<String, BinaryOperation> ops = new HashMap<String, BinaryOperation>();
ops.put("ADD", new BinaryOperation() {
public int apply(int a, int b) {
return a + b;
}
});
ops.put("MUL", new BinaryOperation() {
public int apply(int a, int b) {
return a * b;
}
});
// etc.
Добавьте метод, который частично относится BinaryOperation
от одного параметра.
abstract class BinaryOperation {
public abstract int apply(int a, int b);
public UnaryOperation partial(final int a) {
return new UnaryOperation() {
public int apply(int b) {
return BinaryOperation.this.apply(a, b);
}
};
}
}
Теперь мы можем написать ваш метод calculate
.
public UnaryOperation calculate(int x, String opString) {
BinaryOperation op = ops.get(opString);
if(op == null)
throw new RuntimeException("Operation not found.");
else
return op.partial(x);
}
Использование:
UnaryOperation f = calculate(3, "ADD");
f.apply(5); // returns 8
UnaryOperation g = calculate(9, "MUL");
f.apply(11); // returns 99
Абстракции, используемые в указанном выше растворе, а именно: первый класс функциональных интерфейсов и частичное применение, являются доступными в библиотеке this.
Я проголосовал за закрытие как ИМО, это слишком локализовано. – home
Я не понимаю вашу проблему, вы уже предоставили решение в псевдокоде. Просто верните x * x; и измените свою подпись метода на 'public int calculate (...)'. – home
Привет домой Я изменил свой вопрос .. –