Lambda表达式详解(包含笔记和对应练习)
1、Lambda表达式
(1)lambda表达式及注意事项
———1、Lambda表达式实现函数式接口
//采用匿名内部类的书写方法 //new了{}这个匿名内部类,实现了Comparator<Integer>()这个接口 Arrays.sort(arr, new Comparator<Integer>() { @Override public int compare(Integer o1,Integer o2){ return o1-o2;//按照升序排序 // return o2-o1;//按照降序排序 } }); //采用Lambda表达式进行简化 Arrays.sort(arr, (Integer o1,Integer o2)->{//方法的形参 return o1-o2;//方法体 } );函数式编程
函数式编程是一种思想特点。
面向对象:先找对象,让对象做事情。
函数式编程思想,忽略面向对象复杂语法,强调做什么,而不是谁去做。
下面要学习的Lambda表达式就是函数式思想的体现。
Lambda表达式的标准格式:
()-> {
}
() 对应着方法的形参
->固定格式
{}对应着方法的方法体
注意点:
Lambda表达式可以用来简化匿名内部类的书写
Lambda表达式只能简化函数式接口的匿名内部类的写法
有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以加@Functionallnterface注解,该注解告诉编译器,检查该接口必须是函数式接口,否则编译器就会报错。
函数式接口:
Lambda表达式常见的三种方式:
将Lambda表达式赋值给函数式接口类型的变量。
将Lambda表达式作为函数式接口类型的参数传给某个方法。
使用函数式接口对Lambda表达式进行强制转换。
Lambda表达式的执行规则:
Lambda 表达式本身只是一个 “方法定义”,只有当你调用它对应的抽象方法时,Lambda 里的代码才会被执行。
@FunctionalInterface; interface Swim { public abstract void swimming(); } public class Main { public static void main(String[] args) { // method( new Swim() { // // public void swimming() { // System.out.println("人在swimming"); // } // }); method( ()->{ System.out.println("小周正在游泳~"); } ); } public static void method(Swim s){ s.swimming(); } }————(1)Lambda表达式实现无参抽象方法
interface SayHiInterface{ String sayHi(); } public class LambdaText3 { public static void main(String[] args) { SayHiInterface pi = ()->"你好啊,这是Lambda表达式"; } }————(2)Lambda表达式实现有参抽象方法
interface AdditionInterface{ int add(int a,int b); } public class LambdaText4 { public static void main(String[] args) { AdditionInterface np = (x,y)-> x+y; int result = np.add(15,26); System.out.println(result); } }————(3)Lambda表达式使用代码块
// 函数式接口 interface CheckGrade { // 查询成绩结果 String check(int grade); } // 测试类 public class GradeDemo { public static void main(String[] args) { // Lambda表达式实现代码块 CheckGrade g = (n) -> { // 如果成绩为90~100 if (n >= 90 && n <= 100) { // 输出成绩为优 return "成绩为优"; // 如果成绩为80~89 } else if (n >= 80 && n < 90) { // 输出成绩为良 return "成绩为良"; // 如果成绩为60~79 } else if (n >= 60 && n < 80) { // 输出成绩为中 return "成绩为中"; // 如果成绩小于60 } else if (n >= 0 && n < 60) { // 输出成绩为差 return "成绩为差"; // 其他数字不是有效成绩 } else { // 输出成绩无效 return "成绩无效"; } }; // 不要丢掉lambda语句后的分号 // 输出查询结果 System.out.println(g.check(89)); } }———2、Lambda表达式调用外部变量
————(1)Lambda表达式无法更改局部变量
局部变量在Lambda表达式中默认被定义为final,也就是说,Lambda表达式只能调用局部变量,却不能改变其值。
lambda表达式只是描述了抽象方法是如何实现的,在抽象方法没有被调用前,lambda 表达式中的代码并没有被执行,因此在运行抽象方法之前类成员变量的值不会发生变化
只要抽象方法被调用,就会执行 lambda 表达式中的代码,类成员变量的值也就会被修改
Lambda表达式的执行规则:
Lambda 表达式本身只是一个 “方法定义”,只有当你调用它对应的抽象方法时,Lambda 里的代码才会被执行。
interface VariableInterface{ void method(); } public class LambdaText5 { public static void main(String[] args) { int value = 100; //创建局部变量 VariableInterface v = ()-> { int num = value - 90; value = 12; //更改局部变量,此处会报错,无法通过编译。 }; } }————(2)Lambda表达式可以更改成员变量
类成员变量在Lambda表达式中不是被final修饰的,因此Lambda表达式可以改变其值。
lambda 表达式可以调用并修改类成员变量的值
lambda 表达式只是描述了抽象方法是如何实现的,在抽象方法没有被调用前,lambda 表达式中的代码并没有被执行,因此在运行抽象方法之前类成员变量的值不会发生变化
只要抽象方法被调用,就会执行 lambda 表达式中的代码,类成员变量的值也就会被修改
Lambda表达式的执行规则:
Lambda 表达式本身只是一个 “方法定义”,只有当你调用它对应的抽象方法时,Lambda 里的代码才会被执行。
interface VariableInterface1{ void method(); } public class LambdaText6 { private int value = 100; public void action(){ 这一行只是【定义 Lambda】,并没有执行! VariableInterface1 v = ()-> { value = -12; }; System.out.println("运行接口方法前value=" + value); v.method();. 调用接口方法(真正执行 Lambda) System.out.println("运行接口方法后value=" + value); } public static void main(String[] args){ LambdaText6 demo = new LambdaText6(); demo.action(); } } 输出为:100 -12———3、Lambda表达式与异常处理
接口的抽象方法可以在定义时声明抛出异常(比如
void method() throws Exception;),用来保障程序安全性。Lambda 表达式本身不需要额外写抛出异常的语法,因为它会默认继承抽象方法声明的异常。
当调用这个被 Lambda 实现的抽象方法时,必须手动进行异常处理(try-catch 捕获 或者 在调用方法上继续 throws 声明)。
(2)Lambda表达式的省略写法
Lambda表达式的省略写法
省略核心:可推导,可省略
method(()->{System.out.println("小周正在游泳~");});
先看上面例题的代码。
()-> 语句;
Lambda的省略规则:
参数类型可以省略不写。
如果只有一个参数,参数类型可以省略,同时()也可以省略。
如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。
Lambda的完整格式:`
Arrays.sort(arr, (Integer o1,Integer o2)->{//方法的形参return o1-o2;//方法体});
Lambda的省略写法
Arrays.sort(arr,(o1,o2)-> o1-o2);
import java.util.Arrays; import java.util.Comparator; public class LambdaText2 { public static void main(String[] args) { String[] str = {"a","aaaa","aaa","aa"}; //匿名内部类 // Arrays.sort(str,new Comparator<String>(){ // @Override // public int compare(String o1, String o2) { // return o1.length()-o2.length(); // } // }); //Lambda表达式完整格式 // Arrays.sort(str,(String o1, String o2)->{ // return o1.length()-o2.length(); // }); //Lambda表达式省略格式 Arrays.sort(str,(o1,o2)->o1.length()-o2.length()); System.out.println(Arrays.toString(str)); } }interface SayHiInterface{ String sayHi(); } public class LambdaText3 { public static void main(String[] args) { SayHiInterface pi = ()->"你好啊,这是Lambda表达式"; } }interface AdditionInterface{ int add(int a,int b); } public class LambdaText4 { public static void main(String[] args) { AdditionInterface np = (x,y)-> x+y; int result = np.add(15,26); System.out.println(result); } }