Lambda表达式基本语法与底层实现

简介: Lambda表达式基本语法与底层实现

前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、Lambda的语法格式

(parameters)-> {statements;}

parameters : Java函数的参数列表

statements : 执行语句

-> : 表明使用指定参数去完成某个功能

代码如下(示例):

public class t1 {
    public int method(int a,int b){
        /* 下面是方法体 */
        return a+b;
    }
    
    (int a,int b) -> {return a + b;}
}

(parameters)-> expression

parameters : Java函数的参数列表

expression : 表达式

-> : 表明使用指定参数去完成某个功能

代码如下(示例):

public class t1 {
    public int method(int a,int b){
        /* 下面是方法体 */
        return a+b;
    }

    (int a,int b) -> {return a + b;}
    
    (int a,int b) -> a + b
}


以上就是最简答的Lambda表达式的形式展示

二、Lambda的语法格式进阶

代码如下(示例):

  // 1.当函数体只有一个语句可以省略大括号(大括号{}是可以选择的)
    (String msg) -> System.out.println("你好我是肌肉猿" + msg);

    // 2.当函数体只有一个参数,可以省略圆括号 同时省略类型(参数圆括号()也是可以选择的)
    msg -> System.out.println("你好我是肌肉猿" + msg);

    // 3.函数体只有一个表达式 省略return
    // 当函数体只有一个表达式 且运算结果匹配返回类型 return关键字可以省略
    (int a,int b) - > a + b

    // 4.省略参数类型 编译器可以自行进行推断
    (a, b) -> a + b

以上就是Lambda表达式的进阶版详细形式展示

三、Lambda的使用前提

1.必须有一个函数式接口(所谓的函数式接口就是只有一个抽象方法的接口,也成为SAM接口,即Single Abstract Method interfaces) 且 有且只有一个抽象方法的接口。

2.在Java8中为了保证函数式接口的正确性,引入一个新注解@FunctionalInterface,主要用于检查编译级别的错误,当你写的接口不符合函数式接口定义时,加上该注解编译器会报错。

四、常见的函数式接口

Runnable / Callable

Supplier / Consumer

Comparator

Predicate

Function

五、Lambda表达式的底层实现

1.Lambda表达式的本质就是函数式接口的匿名子类的匿名对象
2.Lambda表达式并不是JVM的基本语法,而是作为后期出现的一种语法糖

底层实现代码演示:

public class LambdaPrinciple {
    public static void main(String[] args) {
        List<String> strList = Arrays.asList("肌", "肉", "猿","爱", "写", "Java");
        // 通过lambda表达式实现元素遍历
        strList.forEach(s -> {
            System.out.println(s);
        });
    }
}
上述代码经过反编译jar包反编译之后:
public class LambdaPrinciple {
    public static void main(String[] args) {
        List<String> strList = Arrays.asList("\u808c", "\u8089", "\u733f", "\u7231", "\u5199", "Java");
        strList.forEach((Consumer<String>)LambdaMetafactory.metafactory
        (null, null, null, 
        (Ljava/lang/Object;)V,
         lambda$main$0(java.lang.String ),
          (Ljava/lang/String;)V)());
    }

    private static void lambda$main$0(String s) {
            System.out.println(s);
        }
}

从上述反编译的结果我们可以看出就是Lambda表达式在真正执行的时候还是转化为Consumer,通过main方法调用来输出。

总结:lambda表达式底层还是用匿名内部类实现,通过ASM技术(动态字节码技术)

目录
相关文章
|
8月前
|
存储 Python
Python函数式编程,如何编写匿名函数(lambda表达式)?
Python函数式编程,如何编写匿名函数(lambda表达式)?
101 2
|
3月前
|
IDE 开发工具 开发者
Kotlin语法 - 函数与Lambda表达式
本教程详细讲解了Kotlin中的函数与Lambda表达式,包括函数的基本定义、默认返回值类型、匿名函数、Lambda表达式的定义及简化、Lambda与函数引用的结合使用,以及如何在Lambda中实现循环控制。适合希望深入了解Kotlin语法的开发者。
57 1
|
3月前
|
Java 编译器 程序员
Lambda表达式的使用、简写与原理深入理解
Lambda表达式的使用、简写与原理深入理解
52 1
|
Java API 开发者
Lambda表达式:简介、语法和用法
Lambda表达式:简介、语法和用法
14962 8
Lambda表达式:简介、语法和用法
|
8月前
|
存储 C++
C++中类和对象的多态性及其基本语法讲解
C++中类和对象的多态性及其基本语法讲解
43 1
|
8月前
|
存储 安全 算法
Java泛型与集合:类型安全的集合操作实践
Java泛型与集合:类型安全的集合操作实践
|
算法 编译器 C++
C++11 Lambda表达式的用法与原理
C++11 Lambda表达式的用法与原理
119 0
|
存储 Java 开发者
1.1 Lambda表达式的基础:Lambda表达式的定义与语法
1.1 Lambda表达式的基础:Lambda表达式的定义与语法
131 0
|
存储 Java
2.4 Lambda表达式在集合操作中的应用:使用Lambda表达式进行排序
2.4 Lambda表达式在集合操作中的应用:使用Lambda表达式进行排序
87 0
|
存储 Java API
2.1 Lambda表达式在集合操作中的应用:使用Lambda表达式遍历集合
2.1 Lambda表达式在集合操作中的应用:使用Lambda表达式遍历集合
193 0