34.Lambda表达式:简化规则&常见应用
2022-02-22 本文已影响0人
每天起床都想摆
Lambda表达式
Lambda概述
-
Lambda表达式是JDK8开始后的一种新的语法形式
-
作用:简化匿名内部类的代码写法
-
Lambda表达式的简化格式
(匿名内部类被重写的形参列表)->{ 被重写方法的方法体代码 }
-
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式
-
函数式接口
-
首先必须是接口,其次接口中有且仅有一个抽象方法的形式
-
通常在接口上方加上一个@FunctionnallInterface注解,标记该接口必须是满足函数式接口
-
错误示范
package com.java.lambda_test; public class LambdaDemo1 { public static void main(String[] args) { // 目标:学会使用Lambda的标准格式简化匿名内部类的代码形式 Animal a = new Animal() { @Override public void run() { System.out.println("乌龟跑的很慢~~~~~"); } }; a.run(); // 注意:lambda并不是可以简化所有匿名匿名内部类形式!! // Animal a1 = () -> { // System.out.println("乌龟跑的很慢~~~~~"); // }; // a1.run(); } } abstract class Animal{ public abstract void run(); }
-
-
测试代码
package com.java.lambda_test; public class LambdaDemo2 { public static void main(String[] args) { // 目标:学会使用Lambda的标准格式简化匿名内部类的代码形式 // 注意:Lambda只能简化接口中只有一个抽象方法的匿名内部类形式(函数式接口) // 1. 匿名内部类原始写法 /* Swimming s1 = new Swimming() { @Override public void swim() { System.out.println("老师游泳贼溜~~~~~"); } } Swimming s1 = () -> { System.out.println("老师游泳贼溜~~~~~"); }; */ // 2.Lambda简化格式 Swimming s1 = () -> System.out.println("老师游泳贼溜~~~~~"); go(s1); System.out.println("---------------------"); /* go(new Swimming() { @Override public void swim() { System.out.println("学生游泳很开心~~~"); } }) go(() ->{ System.out.println("学生游泳很开心~~~"); }); */ // 2.1 Lambda表达式中重写方法作为参数传递以简化格式 go(() -> System.out.println("学生游泳很开心~~~")); } public static void go(Swimming s) { System.out.println("开始。。。"); s.swim(); System.out.println("结束。。。"); } } @FunctionalInterface // 一旦加上这个注解必须是函数式接口,里面只能有一个抽象方法 interface Swimming { void swim(); }
Lambda简化常见函数接口
Lambda表达式简化Comparator接口的匿名形式
image.pngLambda表达式简化按钮监听器ActionListener的匿名内部类形式
image.png综合测试代码
package com.java.lambda_test;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Comparator;
public class LambdaDemo3 {
public static void main(String[] args) {
Integer[] ages1 = {34, 12, 42, 23};
/**
参数一:被排序的数组 必须是引用类型的元素
参数二:匿名内部类对象,代表了一个比较器对象。
*/
// Arrays.sort(ages1, new Comparator<Integer>() {
// @Override
// public int compare(Integer o1, Integer o2) {
// return o2 - o1; // 降序
// }
// });
// Arrays.sort(ages1, (Integer o1, Integer o2) -> {
// return o2 - o1; // 降序
// });
// Arrays.sort(ages1, ( o1, o2) -> {
// return o2 - o1; // 降序
// });
Arrays.sort(ages1, ( o1, o2 ) -> o2 - o1 );
System.out.println(Arrays.toString(ages1));
System.out.println("---------------------------");
JFrame win = new JFrame("登录界面");
JButton btn = new JButton("我是一个很大的按钮");
// btn.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// System.out.println("有人点我,点我,点我!!");
// }
// });
// btn.addActionListener((ActionEvent e) -> {
// System.out.println("有人点我,点我,点我!!");
// });
// btn.addActionListener(( e) -> {
// System.out.println("有人点我,点我,点我!!");
// });
// btn.addActionListener( e -> {
// System.out.println("有人点我,点我,点我!!");
// });
btn.addActionListener( e -> System.out.println("有人点我,点我,点我!!") );
win.add(btn);
win.setSize(400, 300);
win.setVisible(true);
}
}
Lambda表达式的省略规则
Lambda表达式的省略写法
进一步在Lambda表达式的基础上继续简化
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以省略,同时括号()也可以省略
- 如果Lambda表达式的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号
- 如果Lambda表达式的方法体代码只有一行代码,可以省略大括号不写,此时
如果该行代码是return语句,则必须省略return不写,同时也必须省略分号:不写
测试代码
package com.java.lambda_test;
import javax.swing.*;
import java.util.Arrays;
public class LambdaDemo3 {
public static void main(String[] args) {
Integer[] ages1 = {34, 12, 42, 23};
/**
参数一:被排序的数组 必须是引用类型的元素
参数二:匿名内部类对象,代表了一个比较器对象。
*/
// 简化规则1 2
// Arrays.sort(ages1, new Comparator<Integer>() {
// @Override
// public int compare(Integer o1, Integer o2) {
// return o2 - o1; // 降序
// }
// });
// Arrays.sort(ages1, (Integer o1, Integer o2) -> {
// return o2 - o1; // 降序
// });
// 简化规则4
// Arrays.sort(ages1, ( o1, o2) -> {
// return o2 - o1; // 降序
// });
Arrays.sort(ages1, (o1, o2) -> o2 - o1); // 两个参数不能省略
System.out.println(Arrays.toString(ages1));
System.out.println("---------------------------");
JFrame win = new JFrame("登录界面");
JButton btn = new JButton("我是一个很大的按钮");
// 简化规则3
// btn.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// System.out.println("有人点我,点我,点我!!");
// }
// });
// btn.addActionListener((ActionEvent e) -> {
// System.out.println("有人点我,点我,点我!!");
// });
// btn.addActionListener(( e) -> {
// System.out.println("有人点我,点我,点我!!");
// });
// btn.addActionListener( e -> {
// System.out.println("有人点我,点我,点我!!");
// });
btn.addActionListener(e -> System.out.println("有人点我,点我,点我!!"));
win.add(btn);
win.setSize(400, 300);
win.setVisible(true);
}
}
极其优雅的降序:Arrays.sort(ages1, (o1, o2) -> o2 - o1);