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技术(动态字节码技术)

目录
相关文章
|
9月前
如何对BigDecimal进行非0判断
如何对BigDecimal进行非0判断
246 3
|
9月前
|
设计模式 算法
状态模式和策略模式有什么区别
状态模式和策略模式有什么区别
179 1
|
9月前
|
IDE Java 开发工具
@Builder这个注解的作用
@Builder这个注解的作用
264 0
|
9月前
|
存储 Java 编译器
.groovy后缀是什么文件
.groovy后缀是什么文件
203 0
|
分布式数据库 Hbase
|
9月前
|
Java
Java中的卫语句
Java中的卫语句
180 0
|
9月前
|
存储 机器学习/深度学习 人工智能
AIGC训练场景下的存储特征研究
在今天这样以AIGC为代表的AI时代下,了解训练场景对于存储的具体诉求同样是至关重要的。本文将尝试解读WEKA的一个相关报告,来看看AIGC对于存储有哪些具体的性能要求。
95174 8
|
Python
lambda
lambda 是一个匿名函数,它通常用于简化代码,使代码更简洁、易读。lambda 函数不需要显式地使用 def 关键字进行定义,可以直接在表达式中使用。它的语法如下:
195 6
|
算法 计算机视觉
非极大值抑制详细原理(NMS含代码及详细注释)
非极大值抑制(Non-Maximum Suppression,NMS)详细原理(含代码及详细注释)
1785 1
非极大值抑制详细原理(NMS含代码及详细注释)
|
9月前
|
存储 算法
从动态规划到贪心算法:最长递增子序列问题的方法全解析
从动态规划到贪心算法:最长递增子序列问题的方法全解析
376 2

热门文章

最新文章