java8知识总结_1.Lambda表达式

1.Lambda表达式

1-1.概述

Lambda 允许我们将函数当成参数传递给某个方法。

关于Lambda表达式的“好处”或是“优点”,很多技术相关网站上的文章或书籍都有提到:”使用 Lambda 表达式可以使代码变的更加简洁紧凑。“,相对来说”缺点“的话,

就是有点不易读,毕竟做java的大多数是面向对象编程,熟练之后,可能渐渐会掌握读Lambda代码的窍门吧。

1-2.语法

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

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

・lambda表达式的特征:

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

1-3.代码示例

・工程结构

 

・自定义接口Operation.java

1 package study_lambda;
2 
3 public interface Operation {
4 
5     /** 两个数的四则运算操作 */
6     int operate(int a, int b);
7 }

・自定义接口ShowMessage.java

1 package study_lambda;
2 
3 public interface ShowMessage {
4 
5     /** 输出信息 */
6     String show(String message);
7 }

・测试类

 1 package study_lambda;
 2 
 3 public class Client {
 4 
 5     /**
 6      * 主要测试内容:
 7      *  1.利用Lambda表达式,实现接口的实例化(注意:自定义接口中只能有一个方法)。
 8      *  2.将上记1.实例化后的接口的实例作为方法的参数,传递给方法体。
 9      *  3.直接利用上记1.实例化后的接口的实例,调用接口的方法。
10      *  4.学习Lambda表达式的一般写法。
11      *  
12      * @param args
13      */
14     
15     public static void main(String[] args) {
16         
17         // #################  1.利用Lambda表达式,实现接口的实例化(注意:自定义接口中只能有一个方法)。
18         // 实现Operation接口的operate方法,模拟加法操作
19         Operation addition = (int a, int b) -> a + b;     // 类型声明
20         
21         // 实现Operation接口的operate方法,模拟减法操作
22         Operation subtraction = (a, b) -> a - b;          // 不用类型声明
23 
24         // 实现Operation接口的operate方法,模拟乘法操作
25         Operation multiplication = (int a, int b) -> {
26             return a * b;
27         };                                                // 大括号中的处理语句(显式返回return)
28 
29         // 实现Operation接口的operate方法,模拟除法操作
30         Operation division1 = (int a, int b) -> a / b;     // 没有大括号且仅一条处理语句(省略返回return)
31         
32         // 实现Operation接口的operate方法:
33         //    1.输出:"第一个参数是:" + 第一个参数
34         //    2.输出:"第二个参数是:" + 第二个参数
35         //    3.返回两个参数相除的结果
36         Operation division2 = (int a, int b) -> {
37             System.out.println("第一个参数是:" + a);
38             System.out.println("第二个参数是:" + b);
39             return a / b;
40         };
41         
42         // ################# 2.将上记自定义接口的实例作为方法的参数,传递给方法体。
43         System.out.println("10 + 5 = " + operate(10, 5, addition));
44         System.out.println("10 - 5 = " + operate(10, 5, subtraction));
45         System.out.println("10 x 5 = " + operate(10, 5, multiplication));
46         System.out.println("10 / 5 = " + operate(10, 5, division1));
47 
48         // ################# 3.直接利用上记1.实例化后的接口的实例,调用接口的方法。
49         System.out.println("10 / 5 = " + division2.operate(10, 5));
50     }
51     
52     public static int operate(int a, int b, Operation operation) {
53         return operation.operate(a, b);
54     }
55 }

 上记代码的执行结果:

Lambda表达式与变量的作用域

在正式说明lambda表达式与变量作用域前,我们先看下lambda表达式一个作用:

就是可以简化末些匿名内部类的写法。

注意:并不是取代所有匿名内部类的写法,只能用来取代函数接口(Functional Interface)的简写

例如:

・java8以前的写法

// 匿名内部类开启线程
new Thread(new Runnable(){// 接口名
    @Override
    public void run(){// 方法名
        System.out.println("Thread run()");
    }
}).start();

・java8Lambda的写法

// java8Lambda表达式开启线程
new Thread(
        () -> System.out.println("Thread run()")// 省略接口名和方法名
).start();

Lambda表达式和匿名内部类一样,可以引用外部的局部变量,但注意一下几点:

  1. 外部的局部变量和Lambda表达式的变量不能同名。
  2. 外部变量必须是被final修饰的或隐式被final修饰的,即不能在Lambda表达式内修改外部局部变量。

代码例:

 编译错误:Lambda expression's parameter str cannot redeclare another local variable defined in an enclosing scope. 

 编译错误:

补充:函数式接口(Functional Interface)

定义:只提供一个方法的普通接口。

java8之前JDK提供的函数式接口

  • java.lang.Runnable
  • java.lang.Comparable
  • java.util.concurrent.Callable

java8提供的新函数式接口

  • java.util.function.Consumer<T>
  • java.util.function.Supplier<T>
  • java.util.function.Predicate<T>
  • java.util.function.Function<T,R>

以及上边代码中自定义的函数式接口

  • Operation
  • ShowMessage
原文地址:https://www.cnblogs.com/yubx/p/12491603.html