Lambda表達(dá)式
Lambda概述
Lambda表達(dá)式是JDK8開始后的一種新的語(yǔ)法形式
作用:簡(jiǎn)化匿名內(nèi)部類的代碼寫法
-
Lambda表達(dá)式的簡(jiǎn)化格式
(匿名內(nèi)部類被重寫的形參列表)->{ 被重寫方法的方法體代碼 } 注意:Lambda表達(dá)式只能簡(jiǎn)化函數(shù)式接口的匿名內(nèi)部類的寫法形式
-
函數(shù)式接口
首先必須是接口,其次接口中有且僅有一個(gè)抽象方法的形式
通常在接口上方加上一個(gè)@FunctionnallInterface注解,標(biāo)記該接口必須是滿足函數(shù)式接口
-
錯(cuò)誤示范
package com.java.lambda_test; public class LambdaDemo1 { public static void main(String[] args) { // 目標(biāo):學(xué)會(huì)使用Lambda的標(biāo)準(zhǔn)格式簡(jiǎn)化匿名內(nèi)部類的代碼形式 Animal a = new Animal() { @Override public void run() { System.out.println("烏龜跑的很慢~~~~~"); } }; a.run(); // 注意:lambda并不是可以簡(jiǎn)化所有匿名匿名內(nèi)部類形式??! // Animal a1 = () -> { // System.out.println("烏龜跑的很慢~~~~~"); // }; // a1.run(); } } abstract class Animal{ public abstract void run(); }
-
測(cè)試代碼
package com.java.lambda_test; public class LambdaDemo2 { public static void main(String[] args) { // 目標(biāo):學(xué)會(huì)使用Lambda的標(biāo)準(zhǔn)格式簡(jiǎn)化匿名內(nèi)部類的代碼形式 // 注意:Lambda只能簡(jiǎn)化接口中只有一個(gè)抽象方法的匿名內(nèi)部類形式(函數(shù)式接口) // 1. 匿名內(nèi)部類原始寫法 /* Swimming s1 = new Swimming() { @Override public void swim() { System.out.println("老師游泳賊溜~~~~~"); } } Swimming s1 = () -> { System.out.println("老師游泳賊溜~~~~~"); }; */ // 2.Lambda簡(jiǎn)化格式 Swimming s1 = () -> System.out.println("老師游泳賊溜~~~~~"); go(s1); System.out.println("---------------------"); /* go(new Swimming() { @Override public void swim() { System.out.println("學(xué)生游泳很開心~~~"); } }) go(() ->{ System.out.println("學(xué)生游泳很開心~~~"); }); */ // 2.1 Lambda表達(dá)式中重寫方法作為參數(shù)傳遞以簡(jiǎn)化格式 go(() -> System.out.println("學(xué)生游泳很開心~~~")); } public static void go(Swimming s) { System.out.println("開始。。。"); s.swim(); System.out.println("結(jié)束。。。"); } } @FunctionalInterface // 一旦加上這個(gè)注解必須是函數(shù)式接口,里面只能有一個(gè)抽象方法 interface Swimming { void swim(); }
Lambda簡(jiǎn)化常見函數(shù)接口
Lambda表達(dá)式簡(jiǎn)化Comparator接口的匿名形式

image.png
Lambda表達(dá)式簡(jiǎn)化按鈕監(jiān)聽器ActionListener的匿名內(nèi)部類形式

image.png
綜合測(cè)試代碼
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};
/**
參數(shù)一:被排序的數(shù)組 必須是引用類型的元素
參數(shù)二:匿名內(nèi)部類對(duì)象,代表了一個(gè)比較器對(duì)象。
*/
// 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("我是一個(gè)很大的按鈕");
// btn.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我!!");
// }
// });
// btn.addActionListener((ActionEvent e) -> {
// System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我?。?);
// });
// btn.addActionListener(( e) -> {
// System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我!!");
// });
// btn.addActionListener( e -> {
// System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我??!");
// });
btn.addActionListener( e -> System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我??!") );
win.add(btn);
win.setSize(400, 300);
win.setVisible(true);
}
}
Lambda表達(dá)式的省略規(guī)則
Lambda表達(dá)式的省略寫法
進(jìn)一步在Lambda表達(dá)式的基礎(chǔ)上繼續(xù)簡(jiǎn)化
- 參數(shù)類型可以省略不寫
- 如果只有一個(gè)參數(shù),參數(shù)類型可以省略,同時(shí)括號(hào)()也可以省略
- 如果Lambda表達(dá)式的方法體代碼只有一行代碼,可以省略大括號(hào)不寫,同時(shí)要省略分號(hào)
- 如果Lambda表達(dá)式的方法體代碼只有一行代碼,可以省略大括號(hào)不寫,此時(shí)
如果該行代碼是return語(yǔ)句,則必須省略return不寫,同時(shí)也必須省略分號(hào):不寫
測(cè)試代碼
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};
/**
參數(shù)一:被排序的數(shù)組 必須是引用類型的元素
參數(shù)二:匿名內(nèi)部類對(duì)象,代表了一個(gè)比較器對(duì)象。
*/
// 簡(jiǎn)化規(guī)則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; // 降序
// });
// 簡(jiǎn)化規(guī)則4
// Arrays.sort(ages1, ( o1, o2) -> {
// return o2 - o1; // 降序
// });
Arrays.sort(ages1, (o1, o2) -> o2 - o1); // 兩個(gè)參數(shù)不能省略
System.out.println(Arrays.toString(ages1));
System.out.println("---------------------------");
JFrame win = new JFrame("登錄界面");
JButton btn = new JButton("我是一個(gè)很大的按鈕");
// 簡(jiǎn)化規(guī)則3
// btn.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我?。?);
// }
// });
// btn.addActionListener((ActionEvent e) -> {
// System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我?。?);
// });
// btn.addActionListener(( e) -> {
// System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我??!");
// });
// btn.addActionListener( e -> {
// System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我!!");
// });
btn.addActionListener(e -> System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我!!"));
win.add(btn);
win.setSize(400, 300);
win.setVisible(true);
}
}
極其優(yōu)雅的降序:Arrays.sort(ages1, (o1, o2) -> o2 - o1);