如何使用和Java 8中的lambda表达式有什么用?

时间:2016-09-30 05:43:02

标签: java java-8

有人能说出在Java 8中使用lambda表达式吗?

我已经尝试过以下代码,无法理解程序的含义:

public static void main(String[] args) {
  state s = new state();
  MathOperation addition = (a, b) -> a + b;
  System.out.println(s.operate(10.1, 5.2, addition));
}

interface MathOperation {
  double operation(double a, double b);
}

private static double operate(double a, double b, MathOperation mo) {
  return mo.operation(a, b);
}

3 个答案:

答案 0 :(得分:1)

Lambda表达式可用于需要只有一种方法实现的接口实例的情况。在这种情况下,

MathOperation addition = ...

...部分需要与MathOperation兼容的值。但我们很懒,对吧?我们不想为这样简单的事情创建一个类:

class Addition implements MathOperation {
    public double operation(double a, double b) {
        return a + b;
    }
}

// usage:
MathOperation addition = new Addition();

那太过分了!

然后是匿名课程,但他们也有点冗长:

MathOperation addition = new MathOperation() {
    public double operation(double a, double b) {
        return a + b;
    }
}

如果你使用lambda表达式,你的代码会更清晰:

MathOperation addition = (a, b) -> a + b;

(a, b)部分指定参数的名称。而->的右侧是接口方法的实际实现。如果是表达式,则隐式添加return关键字。多好啊!

"等一下!参数的类型在哪里?"您询问。好吧,因为一切都可以从界面推断出来,所以没有必要明确指定类型!

现在您有一个名为addition的变量,它存储接口MathOperation的实现。实施只是return a + b

现在我认为您可以自己理解其余的代码。

答案 1 :(得分:0)

程序仅计算两个参数的总和。 在您的情况下10.1 + 5.2

BTW:了解Java命名约定。类名应以大写字母开头

答案 2 :(得分:0)

基本上,这句话:

MathOperation addition = (a, b) -> a+b;

addition分配给implements MathOperation的新匿名类的对象。该类实现operation方法;该实现添加了两个参数。像

这样的东西
class SomeAnonymousClass implements MathOperation {
    @Override
    public double operation(double a, double b) {
        return a + b;
    }
}

因此,当operation方法用于此类的对象(如示例中的mo.operation)时,它将返回参数的总和。