一、简介
1.概述:
Lambda 是JDK8 开始后的一种新语法形式
2.作用:
简化匿名内部类的代码写法
3.简化条件:
只能简化函数式接口的匿名内部类的写法形式
(函数式接口:(1)必须是接口,其次有且仅有一个抽象方法的形式
(2)通常会在接口上加上一个@Functionallnterface,标记该接口必须是满足函 数式接口)
4.使用好处:
Lambda 是一个匿名函数,可以把Lambda 理解为是一段可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,使Java语言表达能力得到了提升。
5.省略进阶版(进一步在 Lambda 表达式的基础上继续简化):
(1)参数类型可以省略不写
(2)如果只有一个参数,参数类型可以省略不写,同时“()”也可以省略不写
(3)如果Lambda 表达式的方法体代码只有一行。可以省略大括号不写,同时要省略分号
(4)如果Lambda 表达式的方法体代码只有一行。可以省略大括号不写。此时,如果这行代码是return语句, 必须省略return不写,同时也必须省略分号
二、代码部分:
1.初步掌握:
package Lambda;
/**
* 目标:学会使用Lambda 的标准格式简化匿名内部类的代码形式
*/
public class LambdaDemo {
public static void main(String[] args) {
//Lambda 只能简化接口中只有一个抽象方法的匿名内部类形式
Swimming s1 = new Swimming() {
@Override
public void swim() {
System.out.println("老师游泳贼溜");
}
};
go(s1);
System.out.println("------------第一次简化----------");
Swimming s2= () ->{
System.out.println("老师游泳贼溜");
};
go(s2);
System.out.println("------------第二次简化----------");
go(()-> System.out.println("老师游泳贼溜"));
System.out.println("------------第三次简化----------");
Swimming s3= () -> System.out.println("老师游泳贼溜");
go(s3);
}
public static void go(Swimming s){
System.out.println("开始。。。");
s.swim();
System.out.println("结束。。。");
}
}
@FunctionalInterface // 一旦加上这个注解,必修是函数式接口,里面只能有一个抽象方法
interface Swimming{
void swim();
}
2.进阶:
进一步的省略,优化代码:
Lambda的省略规则:(进一步在 Lambda 表达式的基础上继续简化)
(1)参数类型可以省略不写
(2)如果只有一个参数,参数类型可以省略不写,同时“()”也可以省略不写
(3)如果Lambda 表达式的方法体代码只有一行。可以省略大括号不写,同时要省略分号
(4)如果Lambda 表达式的方法体代码只有一行。可以省略大括号不写。此时,如果这行代码是return语句, 必须省略return不写,同时也必须省略分号
package Lambda;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Comparator;
/**
* Lambda的省略规则:(进一步在 Lambda 表达式的基础上继续简化)
* (1)参数类型可以省略不写
* (2)如果只有一个参数,参数类型可以省略不写,同时“()”也可以省略不写
* (3)如果Lambda 表达式的方法体代码只有一行。可以省略大括号不写,同时要省略分号
* (4)如果Lambda 表达式的方法体代码只有一行。可以省略大括号不写。此时,如果这行代码是return语句,
* 必须省略return不写,同时也必须省略分号
*/
public class test1 {
public static void main(String[] args) {
Integer[] ages1 = {34,12,42,23};
/**
* 参数一:被排序的数组,必须是引用类型的元素
* 参数二:匿名内部类对象,代表了一个比较器对象
*/
System.out.println("-------------第一种表达方式-----------------");
Arrays.sort(ages1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(Arrays.toString(ages1));
System.out.println("-------------第二种表达方式(简化)----------");
Arrays.sort(ages1 , (Integer o1, Integer o2)->{
return o2-o1;
});//降序
System.out.println(Arrays.toString(ages1));
System.out.println("--------------第三种方式-------------------");
Arrays.sort(ages1 , (o1 , o2) ->{
return o2-o1;
});//参数类型可以省略不写
System.out.println(Arrays.toString(ages1));
System.out.println("--------------第四种表达方式----------------");
Arrays.sort(ages1 , (o1,o2) -> o2-o1);//如果Lambda 表达式的方法体代码只有一行。
// 可以省略大括号不写。此时,如果这行代码是return语句,
//必须省略return不写,同时也必须省略分号
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("有人点我,点我,点我");
}
});
System.out.println("------------第二种表达方式--------------");
btn.addActionListener((ActionEvent e) ->{ System.out.println("有人点我,点我,点我"); });
win.add(btn);
win.setSize(400,300);
win.setVisible(true);
}
}