interface PairFloatFunction {
Pair<Float,Float> calculate(int x);
}
interface FloatFunction {
float calculate(int x);
}
class SQRT implements PairFloatFunction {
public Pair<Float, Float> calculate(int x) {
return new Pair(-pow(x,0.5), pow(x,0.5))
}
}
class ADD_ONE implements FloatFunction {
public Float calculate(int x) {
return x + 1;
}
}
我想撰写函数,以便我可以执行此操作:
ADD_ONE(SQRT(100)) = Pair(-9,11)
我理解我需要将这些功能“粘合”在一起。 但我被困在这里,我应该写另一个方法重载吗?
class ADD_ONE {
public Float calculate(int x) {
return x + 1;
}
public Float calculate(Pair pair) {
pair.first += 1;
pair.second += 1;
return pair
}
}
对不起,我是函数式编程的新手,有一个很好的解决方案吗?
答案 0 :(得分:1)
根据上面的代码,我将创建一个负责计算的通用接口。
interface Calculation<T> {
T calculate(int x);
}
这是一个Java 7实现,因为您没有指定Java 8。
返回类型T
是通用的;意味着您的实现可以返回任何Object
类型,但它必须使用整数x
。您甚至可以使x
参数通用,以便您可以决定将哪个函数作为参数类型。
注意:静态类将被移动到它们自己的类文件中,并且应该删除静态修饰符。为了简洁起见,我这样做只是为了巩固一切。
public class Functional {
static interface Calculation<T> {
T calculate(int x);
}
static class Sqrt implements Calculation<Pair<Float, Float>> {
public Pair<Float, Float> calculate(int x) {
float root = (float) Math.pow(x, 0.5);
return new Pair<Float, Float>(-root, +root);
}
}
static class AddOne implements Calculation<Float> {
public Float calculate(int x) {
return (float) (x + 1);
}
}
static <T> T calculate(int x, Calculation<T> calculation) {
return calculation.calculate(x);
}
public static void main(String[] args) {
Calculation<?>[] calculations = { new Sqrt(), new AddOne() };
int x = 49;
for (Calculation<?> calculation : calculations) {
System.out.printf("%s: %s%n",
calculation.getClass().getSimpleName(),
calculate(x, calculation));
}
}
static class Pair<T, U> {
private T val1;
private U val2;
public Pair(T val1, U val2) {
this.val1 = val1;
this.val2 = val2;
}
protected T getVal1() {
return val1;
}
protected void setVal1(T val1) {
this.val1 = val1;
}
protected U getVal2() {
return val2;
}
protected void setVal2(U val2) {
this.val2 = val2;
}
@Override
public String toString() {
return "(" + val1 + ", " + val2 + ")";
}
}
}
Sqrt: (-7.0, 7.0)
AddOne: 50.0