带有其他操作数的Java lambda表达式

时间:2015-11-11 13:12:07

标签: java lambda interface java-8 operator-overloading

这个lambda表达式适用于具有两个操作数(a和b)的数学运算。

public class Math {
  interface IntegerMath {
    int operation(int a, int b);       
  }

  private static int apply(int a, int b, IntegerMath op) {
    return op.operation(a, b);
  }

  public static void main(String... args) {
    IntegerMath addition = (a, b) -> a + b;
    IntegerMath subtraction = (a, b) -> a - b;
    System.out.println("40 + 2 = " + apply(40, 2, addition));
    System.out.println("20 - 10 = " + apply(20, 10, subtraction));

  }
}

如何使用一元操作来增强此类,例如

IntergerMath square = (a) -> a * a;

3 个答案:

答案 0 :(得分:3)

您不能使用IntegerMath,因为它是一个功能接口,其单个抽象方法需要两个int个参数。您需要一个新的界面来进行一元操作。

顺便说一下,你不必自己定义这些界面。 java.util.function包含您可以使用的界面,例如IntUnaryOperatorIntBinaryOperator

答案 1 :(得分:2)

您无法执行此操作,因为square方法没有相同的签名。

请注意,您还可以使用IntBinaryOperatorIntUnaryOperator(您可以注意到它们是完全独立的),而不是创建自己的界面。

答案 2 :(得分:0)

  

您需要一个新的界面来进行一元操作。

public class Math {
  interface BinMath {
    int operation(int a, int b);

  }

  interface UnMath {
    int operation(int a);

  }

  private static int apply(int a, int b, BinMath op) {
    return op.operation(a, b);
  }

  private static int apply(int a, UnMath op) {
    return op.operation(a);
  }

  public static void main(String... args) {
    BinMath addition = (a, b) -> a + b;
    BinMath subtraction = (a, b) -> a - b;
    UnMath square = (a) -> a * a;

    System.out.println("40 + 2 = " + apply(40, 2, addition));
    System.out.println("20 - 10 = " + apply(20, 10, subtraction));
    System.out.println("20² = " + apply(20, square));

  }
}