前言
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、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技术(动态字节码技术)