• 1 什么是Lambda表达式 look


    1 什么是Lambda表达式

    Runnable接口

    @FunctionalInterface // 被该注解修饰的接口只能声明一个抽象方法
    public interface Runnable {
        public abstract void run();
    }
    

    代码结构

    new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("新线程中执行的代码 :"+Thread.currentThread().getName());
                }
            }).start();// 不是用lambda的创建线程的写法
    

    以上述代码为例:

    • 都知道 不能直接调用接口 要摸就是类实现接口 然后实例化调用方法
    • 或者直接采用 匿名类部类的方式 Lambda就是简化匿名类部类的写法
    • 传统的方式 一般都采用 上述代码 或则类似的

    使用Lambda简化

    当然还可以做到更加简化 在下面会详细介绍

    new Thread(() ->{
                System.out.println("新线程中执行的代码 :"+Thread.currentThread().getName());
            }).start();
    

    2 Lambda的语法规则

    Lambda省去了面向对象的条条框框,Lambda的标准格式由3个部分组成:

    (参数类型 参数名称) -> {
    代码体;
    }
    

    格式说明:

    • (参数类型 参数名称):参数列表
    • {代码体;} :方法体
    • ->: 箭头,分割参数列表和方法体

    简单练习:

    • 无参
    public class Demo1Lambda {
        public static void main(String[] args) {
              // 开启一个新的线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("新线程中执行的代码 :"+Thread.currentThread().getName());
                }
            }).start();// 不是用lambda的创建线程的写法
            
            new Thread(() ->{ // 调用无参的方法
                System.out.println("新线程中执行的代码 :"+Thread.currentThread().getName());
            }).start();
            System.out.println("主线程中的代码:" + Thread.currentThread().getName());
        }
    }
    

    3 @FunctionalInterface注解

    /**
    * @FunctionalInterface
    * 这是一个标志注解,被该注解修饰的接口只能声明一个抽象方法
    * 多个会编译不通过
    */
    @FunctionalInterface
    public interface UserService {
    void show();
    }
    

    4 Lambda表达式的省略写法

    在lambda表达式的标准写法基础上,可以使用省略写法的规则为:

    1. 小括号内的参数类型可以省略
    2. 如果小括号内有且仅有一个参数,则小括号可以省略
    3. 如果大括号内有且仅有一个语句,可以同时省略大括号,return 关键字及语句分号。

    接口

    public interface StudentService {
        String show(String name, Long id) ;
    }
    

    代码实现

     public static void main(String[] args) {
         	goStudent((String name,Long id) ->{
                return name+id;
            });
         	// lambda简化后的代码
            goStudent((String name,Long id) -> name+id+666);
        }
    
    	// 自定义的方法
        public static void goStudent(StudentService studentService){
            System.out.println(studentService.show("张三", 22L));
        }
    
    • 一般我们都会根据代码的可读性 适度的去简化

    5 Lambda表达式的使用前提

    Lambda表达式的语法是非常简洁的,但是Lambda表达式不是随便使用的,使用时有几个条件要特别注

    1. 方法的参数或局部变量类型必须为接口才能使用Lambda
    2. 接口中有且仅有一个抽象方法(@FunctionalInterface)

    6 Lambda和匿名内部类的对比

    Lambda和匿名内部类的对比

    1. 所使用场景的类型不一样
      • 匿名内部类的类型可以是 类,抽象类,接口
      • Lambda表达式需要的类型必须是接口
    2. 抽象方法的数量不一样
      • 匿名内部类所需的接口中的抽象方法的数量是随意的
      • Lambda表达式所需的接口中只能有一个抽象方法
    3. 实现原理不一样
      • 匿名内部类是在编译后形成一个class
      • Lambda表达式是在程序运行的时候动态生成class
  • 相关阅读:
    DBA-常用到的动态视图分析语句
    SQL Server 复制(Replication) ——事务复制搭建
    SQL Server 不同网段IP通过名称访问
    [javaEE] HTTP协议总结
    [android] 从gallery获取图片
    [android] 加载大图片到内存
    [javaEE] web应用的目录结构&配置虚拟主机
    [android] 代码注册广播接收者&利用广播调用服务的方法
    [android] 采用aidl绑定远程服务
    [Linux] Linux的环境变量
  • 原文地址:https://www.cnblogs.com/look-word/p/16337565.html
Copyright © 2020-2023  润新知