Lambda
作用: 简化匿名内部类的代码写法。
注意: Lambda表达式只能简化函数式接口的匿名类的写法形式。
什么是函数是接口:
首先必须是接口,其次接口中有且仅有一个抽象方法的形式。
通常我们会在接口上加上一个 @FunctionalInterface 注解,标记该接口必须是满足函数式接口。
1 public class lambda_demo2 { 2 public static void main(String[] args) { 3 4 // 简化 5 Swimming s1 = () -> { 6 7 System.out.println("老师游泳厉害"); 8 }; 9 go(s1); 10 11 System.out.println("------------------------------------"); 12 13 go(() -> { 14 System.out.println("学生游泳也厉害"); 15 }); 16 } 17 // 接口作为类型,代表可以接所有子类对象 18 public static void go(Swimming s) { 19 System.out.println("开始!"); 20 s.swim(); 21 System.out.println("结束!"); 22 } 23 } 24 25 @FunctionalInterface // 一旦加上这个注解必须是函数式接口,里面只能有一个抽象方法 26 interface Swimming{ 27 void swim(); 28 }
Comparator , 窗口监听 也可以简化
1 import javax.swing.*; 2 import java.awt.event.ActionEvent; 3 import java.util.Arrays; 4 5 public class lambda_demo3 { 6 public static void main(String[] args) { 7 8 // 降序排序 (自定义比较器对象,只能支持引用类型的排序) 9 // Integer[] ages1 = {34, 21, 45, 12}; 10 // Arrays.sort(ages1, new Comparator<Integer>() { 11 // @Override 12 // public int compare(Integer o1, Integer o2) { 13 // 14 // //降序 15 // return -(o1 - o2); 16 // } 17 // }); 18 19 20 // 简化 21 Integer[] ages1 = {34, 21, 45, 12}; 22 Arrays.sort(ages1, (Integer o1, Integer o2) -> { 23 { 24 //降序 25 return -(o1 - o2); 26 } 27 }); 28 System.out.println(Arrays.toString(ages1)); 29 30 System.out.println("----------------------------------"); 31 32 JFrame win = new JFrame("登录界面"); 33 JButton btn = new JButton("按钮"); 34 35 // btn.addActionListener(new ActionListener() { 36 // @Override 37 // public void actionPerformed(ActionEvent e) { 38 // System.out.println("监听到有人再按"); 39 // } 40 // }); 41 42 //监听是否再按按钮 43 btn.addActionListener((ActionEvent e) -> { 44 System.out.println("监听到有人在按"); 45 }); 46 47 win.add(btn); 48 win.setSize(200, 200); 49 win.setVisible(true); 50 } 51 52 }
Lambda表达式的省略方法(进一步在Lambda表达式的基础上继续简化)
参数类型可以省略不写。
如果只有一个参数,参数类型可以省略,可以省略大括号不写,同时要省略分号。
如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,此时,如果这行代码是return语句,必须省略return不写,同时也必须省略分号不写。