zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    二次冲刺站立会议七
    二次冲刺站立会议六
    二次冲刺站立会议五
    二次冲刺站立会议四
    二次冲刺站立会议三
    二次冲刺站立会议二
    二次冲刺站立会议一
    Linux课程学习总结
    仿知乎专栏的软件系统设计方案
    仿知乎专栏的需求分析和概念原型
  • 原文地址:https://www.cnblogs.com/yubx/p/12491603.html
Copyright © 2011-2022 走看看