一、前言
1.lambda表达式是JDK1.8中的一个重要特性,lambda表达式允许你通过表达式来代替功能接口(通过表达式实现业务功能),lambda表达式可以看做一个匿名函数。实际上就是为了让你的代码变得更加的简洁美观。
二、lambda表达式优点
- 提供了更简单的语法和写代码的方式
- 取代了匿名内部类
- 简化代码,干净整洁
- 方便了函数式编程
- 增强了集合的操作
三、lambda表达式缺点
- 代码可读性变差
- 不容易进行调试
四、lambda语法
(参数列表)->{业务代码实现....} 箭头的意思可以通俗的理解为被用于的意思。不可以省略。
1.代码:
package thread.enumandlambda;
import java.util.Arrays;
import java.util.List;
/**
* @Author: wenjingyuan
* @Date: 2022/10/29/20:40
* @Description:
*/
public class LambdaTest {
public static void main(String[] args) {
List<String> list= Arrays.asList("java","mysql","lambda","spring");
//传统的打印方法
for(String item:list){
System.out.println(item);
}
System.out.println();
//学完lambda之后
list.forEach((item)->{
System.out.println(item);
});
}
}
2.执行结果:
3.语法注意事项:
- 如果参数值有一个参数,那么括号可以省略
- 方法体中只有一行代码,则大括号可以省略
- 方法体中只有一行语句,并且是return语句,那么大括号包括return都可以省略
五、lambda表达式和函数式接口
下面是一些lambda表达式的举例:
// 1. 不需要参数,返回值为 2
() -> 2// 2. 接收⼀个参数 ( 数字类型 ), 返回其 2 倍的值x -> 2 * x// 3. 接受 2 个参数 ( 数字 ), 并返回他们的和( x , y ) -> x + y// 4. 接收 2 个 int 型整数 , 返回他们的乘积(int x , int y ) -> x * y// 5. 接受⼀个 string 对象 , 并在控制台打印 , 不返回任何值 ( 看起来像是返回 void)(String s ) -> System . out . print ( s )
Lambda 表达式不能直接使⽤。
Lambda 表达式不能直接使⽤,它在使⽤之前必须初始化,lambda 表达式必须借助函数式接⼝
(@FunctionalInterface)来初始化。
六、函数式接口
1.定义:⼀个接⼝有且只有⼀个抽象⽅法。
2.如果一个接口有且只有一个抽象方法,那么你可以将他理解为函数式接口,函数式接口可以用
@FunctionalInterface来检查。理论上来说,只要你的接口中存在一个抽象方法,都算是函数式接口。
2.举例说明:
1.变量捕获
lambda表达式在使用外部的变量时,必须要保证在使用之前变量不会更改。使用的时候就是在大括号里不能更改变量的值。如果变量用final修饰更能保证他不被修改,在修改的时候就会报错,如果不使用final修饰,在lambda表达式的时候就会报错。
2.lambda用法
-
map.foreach()
-
list排序
package thread.enumandlambda;
import java.util.*;
/**
* @Author: wenjingyuan
* @Date: 2022/10/29/20:40
* @Description:
*/
public class LambdaTest {
public static void main(String[] args) {
//printTest();
// interFaceTest();
// mapTest();
//创建并初始化list
List<Integer> list=Arrays.asList(5,3,6,8,2);
System.out.println("排序前"+list);
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
System.out.println("排序后"+list);
}
private static void printTest() {
List<String> list= Arrays.asList("java","mysql","lambda","spring");
//传统的打印方法
for(String item:list){
System.out.println(item);
}
System.out.println();
//学完lambda之后
list.forEach((item)->{
System.out.println(item);
});
}
private static void mapTest() {
HashMap<String,String> map=new HashMap<String,String>(){{
put("java","java value");
put("mysql","mysql value");
}};
//jdk 1.8之前
for(Map.Entry<String,String> item:map.entrySet()){
System.out.println(item.getKey()+":"+item.getValue());
}
//lambda
map.forEach((k,v)->{
System.out.println(k+":"+v);
});
}
/**
* 函数式接口实例
*/
private static void interFaceTest() {
MyFunctionalInterface myFunctionalInterface=(o)->{
for(Object item: o){
System.out.println(item);
}
};
myFunctionalInterface.myMethod("java","Mysql");
}
}
-
list查找过滤
private static void distinctTest() {
List<String> list=Arrays.asList("java","lambda","mysql","spring","lambda","springBoot");
//jdk1.8之前
for(String item:list){
if(item.equals("lambda")){
System.out.println("");
}
}
//lambda之后
List<String> finds=list.stream().filter(
s->s.equals("lambda")).collect(Collectors.toList());
System.out.println(finds);
}
七、总结
最后我想说,自律即是自由!希望大家在最后都有一个不错的收获!今天还听到一个很有意思的话想分享给自己和大家,用我自己的话总结一下,最终能够在这个世界生存留下来的人,不是最聪明的,也不是最厉害的,是适应能力最强的人!