Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

语法

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

(parameters) -> expression
或
(parameters) ->{ statements; }

特征:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

Lambda 表达式实例

 1 public class Lambda_example {
 2 
 3     final static String str = "Hello! ";
 4 
 5     public static void main(String[] args) {
 6         AtomicReference<String> strr = new AtomicReference<>("Hello! ");
 7 
 8         // 1. 不需要参数,返回值为 5
 9         () -> 5;
10         Supplier<Integer> integerSupplier = () -> 5;
11         System.out.println(integerSupplier.get());
12 
13         // 2. 接收一个参数(数字类型),返回其2倍的值
14         x -> 2 * x;
15         IntToDoubleFunction function = x -> 2 * x;
16         System.out.println(function.applyAsDouble(2));
17 
18         // 3. 接受2个参数(数字),并返回他们的和,不用类型声明
19         (x, y) -> x + y;
20         MathOperation subtraction = (x, y) -> x + y;
21         System.out.println(new Lambda_example().operate(10,5,subtraction));
22 
23         // 4. 接收2个int型整数,返回他们的和,类型声明,没有返回语句
24         (int x, int y) -> x + y;
25         MathOperation subtraction = (int x, int y) -> x + y;
26         (String s) -> s.length();
27         Function<String, Integer> function = (String s) -> s.length();
28 
29         IntBinaryOperator intBinaryOperator = (int x, int y) -> x + y;
30         System.out.println(intBinaryOperator.applyAsInt(10,5));
31 
32         // 5. 接收2个int型整数,返回他们的和,类型声明,有返回语句
33         (int a, int b) -> { return a * b; };
34         IntBinaryOperator intBinaryOperator1 = (int a, int b) -> {
35             return a * b;
36         };
37         System.out.println(intBinaryOperator1.applyAsInt(10,5));
38 
39         // 6. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
40         (String s) -> System.out.print(s);
41 
42         // 7. 线程实例
43         new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
44 
45         // 8. 谓词,返回true/false
46         String s = "hehe";
47         Predicate<String> filter = (String ss) -> ss.equals("haha");
48         Predicate<String> filter1 = (String ss) -> ss.equals("hehe");
49         System.out.println(filter1.test(s));
50         System.out.println(filter.and(filter1).test(s));
51         System.out.println(filter.or(filter1).test(s));
52 
53         // 9. lambda 内部不能修改定义在域外的局部变量,但能引用标记了 final 的外层局部变量
54         (String ss) -> str="haha";
55         Function<String, String> stringFunction = (String ss) -> str + "hehe";
56 
57         // 10 . lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改
58         Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + 2));
59 
60     }
61     interface MathOperation {
62         int operation(int a, int b);
63     }
64 
65     private int operate(int a, int b, MathOperation mathOperation){
66         return mathOperation.operation(a, b);
67     }
68 
69 }

 

posted @ 2020-10-12 16:42  柒月丶  阅读(231)  评论(0)    收藏  举报