用Java编写Function接口

时间:2015-07-09 18:16:41

标签: java functional-programming

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

对不起,我是函数式编程的新手,有一个很好的解决方案吗?

1 个答案:

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