Java 8 Lambda 表达式

java

Java 8 Lambda 表达式
语法

lambda 表达式的语法格式如下:

(parameters) -> expression

(parameters) ->{ statements; }

Lambda 表达式实例

public class Calculator {

interface IntegerMath {

int operation(int a, int b);

}

public int operateBinary(int a, int b, IntegerMath op) {

return op.operation(a, b);

}

public static void main(String... args) {

Calculator myApp = new Calculator();

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

IntegerMath subtraction = (a, b) -> a - b;

System.out.println("40 + 2 = " + myApp.operateBinary(40, 2, addition));

System.out.println("20 - 10 = " + myApp.operateBinary(20, 10, subtraction));

}

}

点击查看结果

```

40 + 2 = 42

20 - 10 = 10

```

public class Java8Lambda {

public static void main(String args[]) {

Java8Lambda tester = new Java8Lambda();

// 类型声明

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

// 不用类型声明

MathOperation subtraction = (a, b) -> a - b;

// 大括号中的返回语句

MathOperation multiplication = (int a, int b) -> {

return a * b;

};

// 没有大括号及返回语句

MathOperation division = (int a, int b) -> a / b;

System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));

System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));

System.out.println("10 / 5 = " + tester.operate(10, 5, division));

// 不用括号

GreetingService greetService1 = message -> System.out.println("Hello " + message);

// 用括号

GreetingService greetService2 = (message) -> System.out.println("Hello " + message);

greetService1.sayMessage("Runoob");

greetService2.sayMessage("Google");

}

interface MathOperation {

int operation(int a, int b);

}

interface GreetingService {

void sayMessage(String message);

}

private int operate(int a, int b, MathOperation mathOperation) {

return mathOperation.operation(a, b);

}

}

点击查看结果

```

10 + 5 = 15

10 - 5 = 5

10 x 5 = 50

10 / 5 = 2

Hello Runoob

Hello Google

```

变量作用域

lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

import java.util.function.Consumer;

public class LambdaScopeTest {

public int x = 0;

class FirstLevel {

public int x = 1;

void methodInFirstLevel(int x) {

// The following statement causes the compiler to generate

// the error "local variables referenced from a lambda expression

// must be final or effectively final" in statement A:

//

// x = 99;

Consumer<Integer> myConsumer = (y) -> {

System.out.println("x = " + x); // Statement A

System.out.println("y = " + y);

System.out.println("this.x = " + this.x);

System.out.println("LambdaScopeTest.this.x = " + LambdaScopeTest.this.x);

};

myConsumer.accept(x);

}

}

public static void main(String... args) {

LambdaScopeTest st = new LambdaScopeTest();

LambdaScopeTest.FirstLevel fl = st.new FirstLevel();

fl.methodInFirstLevel(23);

}

}

点击查看结果

```

x = 23

y = 23

this.x = 1

LambdaScopeTest.this.x = 0

```

lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改。(即隐性的具有 final 的语义)

public class Java8Tester {

public static void main(String args[]) {

final int num = 1;

Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));

s.convert(2); // 输出结果为 3

}

public interface Converter<T1, T2> {

void convert(int i);

}

}

在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

参考资料

  • What's New in JDK 8
  • Java 8 新特性
  • http://www.cnblogs.com/onetwo/p/8526374.html
  • Lambda Expressions
  • https://blog.csdn.net/yitian_66/article/details/81010434

以上是 Java 8 Lambda 表达式 的全部内容, 来源链接: utcz.com/z/391143.html

回到顶部