日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java基础day22

發(fā)布時(shí)間:2025/3/12 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础day22 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java基礎(chǔ)day22

  • Java基礎(chǔ)day22-Lambda&方法引用
  • 1.Lambda表達(dá)式
    • 1.1體驗(yàn)Lambda表達(dá)式
    • 1.2Lambda表達(dá)式的標(biāo)準(zhǔn)格式
    • 1.3Lambda表達(dá)式練習(xí)1
    • 1.4Lambda表達(dá)式練習(xí)2
    • 1.5Lambda表達(dá)式練習(xí)3
    • 1.6Lambda表達(dá)式的省略模式
    • 1.7Lambda表達(dá)式的注意事項(xiàng)
    • 1.8Lambda表達(dá)式和匿名內(nèi)部類(lèi)的區(qū)別
  • 2.接口組成更新
    • 2.1接口組成更新概述
    • 2.2接口中默認(rèn)方法
    • 2.3接口中靜態(tài)方法
    • 2.4接口中私有方法
  • 3.方法引用
    • 3.1體驗(yàn)方法引用
    • 3.2方法引用符
    • 3.3引用類(lèi)方法
    • 3.4引用對(duì)象的實(shí)例方法
    • 3.5引用類(lèi)的實(shí)例方法
    • 3.6引用構(gòu)造器【應(yīng)用】

Java基礎(chǔ)day22-Lambda&方法引用

1.Lambda表達(dá)式

1.1體驗(yàn)Lambda表達(dá)式

  • 案例需求
    啟動(dòng)一個(gè)線程,在控制臺(tái)輸出一句話:多線程程序啟動(dòng)了
  • 實(shí)現(xiàn)方式一
    實(shí)現(xiàn)步驟
    ? 定義一個(gè)類(lèi)MyRunnable實(shí)現(xiàn)Runnable接口,重寫(xiě)run()方法
    ? 創(chuàng)建MyRunnable類(lèi)的對(duì)象
    ? 創(chuàng)建Thread類(lèi)的對(duì)象,把MyRunnable的對(duì)象作為構(gòu)造參數(shù)傳遞
    ? 啟動(dòng)線程
  • 實(shí)現(xiàn)方式二
    匿名內(nèi)部類(lèi)的方式改進(jìn)
  • 實(shí)現(xiàn)方式三
    Lambda表達(dá)式的方式改進(jìn)
  • 代碼演示
//方式一的線程類(lèi) public class myRunnable implements Runnable {@Overridepublic void run() {System.out.println("多線程程序啟動(dòng)了");} }public class Lambdademo {public static void main(String[] args) {//方式一myRunnable my = new myRunnable();Thread th = new Thread(my);th.start();//方式二new Thread(new Runnable() {@Overridepublic void run() {System.out.println("多線程啟動(dòng)了");}}).start();//方式三new Thread(() -> {System.out.println("多線程");}).start();} }
  • 函數(shù)式編程思想概述
    函數(shù)式思想則盡量忽略面向?qū)ο蟮膹?fù)雜語(yǔ)法:“強(qiáng)調(diào)做什么,而不是以什么形式去做”
    而我們要學(xué)習(xí)的Lambda表達(dá)式就是函數(shù)式思想的體現(xiàn)

1.2Lambda表達(dá)式的標(biāo)準(zhǔn)格式

  • 格式:
    (形式參數(shù)) -> {代碼塊}
    ?形式參數(shù):如果有多個(gè)參數(shù),參數(shù)之間用逗號(hào)隔開(kāi);如果沒(méi)有參數(shù),留空即可
    ?->:由英文中畫(huà)線和大于符號(hào)組成,固定寫(xiě)法。代表指向動(dòng)作
    ?代碼塊:是我們具體要做的事情,也就是以前我們寫(xiě)的方法體內(nèi)容
  • 組成Lambda表達(dá)式的三要素:
    形式參數(shù),箭頭,代碼塊

1.3Lambda表達(dá)式練習(xí)1

  • Lambda表達(dá)式的使用前提
    有一個(gè)接口
    接口中有且僅有一個(gè)抽象方法
  • 練習(xí)描述
    無(wú)參無(wú)返回值抽象方法的練習(xí)
  • 操作步驟
    定義一個(gè)接口(Eatable),里面定義一個(gè)抽象方法:void eat();
    定義一個(gè)測(cè)試類(lèi)(EatableDemo),在測(cè)試類(lèi)中提供兩個(gè)方法
    一個(gè)方法是:useEatable(Eatable e)
    一個(gè)方法是主方法,在主方法中調(diào)用useEatable方法
  • 示例代碼
//接口 public interface eatable {void eat(); }//實(shí)現(xiàn)類(lèi) public class eatImpl implements eatable {@Overridepublic void eat() {System.out.println("一天一蘋(píng)果");} }//測(cè)試類(lèi) public class eatdemo {public static void main(String[] args) {//在主方法中調(diào)用useEatable方法eatImpl e = new eatImpl();useEatable(e);//匿名內(nèi)部類(lèi)useEatable(new eatable() {@Overridepublic void eat() {System.out.println("一天一蘋(píng)果2");}});//Lambda表達(dá)式useEatable(() -> {System.out.println("一天一蘋(píng)果3");});}public static void useEatable(eatable e){e.eat();} }

1.4Lambda表達(dá)式練習(xí)2

  • 練習(xí)描述
    有參無(wú)返回值抽象方法的練習(xí)
  • 操作步驟
    定義一個(gè)接口(Flyable),里面定義一個(gè)抽象方法:void fly(String s);
    定義一個(gè)測(cè)試類(lèi)(FlyableDemo),在測(cè)試類(lèi)中提供兩個(gè)方法
    一個(gè)方法是:useFlyable(Flyable f)
    一個(gè)方法是主方法,在主方法中調(diào)用useFlyable方法
  • 示例代碼
public interface Flyable {void fly(String s); }public class Flyabledemo {public static void main(String[] args) {//在主方法中調(diào)用useFlyable方法// 匿名內(nèi)部類(lèi)useFlyable(new Flyable() {@Overridepublic void fly(String s) {System.out.println(s);System.out.println("飛機(jī)起飛");}});System.out.println("--------");//LambdauseFlyable((s) -> {System.out.println(s);System.out.println("飛機(jī)起飛");});}public static void useFlyable(Flyable f){f.fly("風(fēng)和日麗");} }

1.5Lambda表達(dá)式練習(xí)3

  • 練習(xí)描述
    有參有返回值抽象方法的練習(xí)
  • 操作步驟
    定義一個(gè)接口(Addable),里面定義一個(gè)抽象方法:int add(int x,int y);
    定義一個(gè)測(cè)試類(lèi)(AddableDemo),在測(cè)試類(lèi)中提供兩個(gè)方法
    一個(gè)方法是:useAddable(Addable a)
    一個(gè)方法是主方法,在主方法中調(diào)用useAddable方法
  • 示例代碼
public interface Addable {int add(int x,int y); }public class Addabledemo {public static void main(String[] args) {//在主方法中調(diào)用useAddable方法useAddable(((x, y) -> {return x+y;}));}public static void useAddable(Addable a){int sum = a.add(10,20);System.out.println(sum);} }

1.6Lambda表達(dá)式的省略模式

  • 省略的規(guī)則
    參數(shù)類(lèi)型可以省略。但是有多個(gè)參數(shù)的情況下,不能只省略一個(gè)
    如果參數(shù)有且僅有一個(gè),那么小括號(hào)可以省略
    如果代碼塊的語(yǔ)句只有一條,可以省略大括號(hào)和分號(hào),和return關(guān)鍵字
  • 代碼演示
public interface Addable {int add(int x,int y); }public interface Flyable {void fly(String s); }public class Lambdademo {public static void main(String[] args) {useAddable((int x,int y) -> {return x+y;});//參數(shù)的類(lèi)型可以省略useAddable(((x, y) -> {return x+y;}));useFlyable((String s) -> {System.out.println(s);});//如果參數(shù)有且僅有一個(gè),那么小括號(hào)可以省略useFlyable(s -> {System.out.println(s);});//如果代碼塊的語(yǔ)句只有一條,可以省略大括號(hào)和分號(hào)useFlyable(s -> System.out.println(s));//如果代碼塊的語(yǔ)句只有一條,可以省略大括號(hào)和分號(hào),如果有return,return也要省略掉useAddable((x,y) -> x+y);}private static void useFlyable(Flyable f) {f.fly("風(fēng)和日麗,晴空萬(wàn)里");}private static void useAddable(Addable a) {int sum = a.add(10, 20);System.out.println(sum);} }

1.7Lambda表達(dá)式的注意事項(xiàng)

  • 使用Lambda必須要有接口,并且要求接口中有且僅有一個(gè)抽象方法
  • 必須有上下文環(huán)境,才能推導(dǎo)出Lambda對(duì)應(yīng)的接口
    根據(jù)局部變量的賦值得知Lambda對(duì)應(yīng)的接口
    ?Runnable r = () -> System.out.println(“Lambda表達(dá)式”);
    根據(jù)調(diào)用方法的參數(shù)得知Lambda對(duì)應(yīng)的接口
    ?new Thread(() -> System.out.println(“Lambda表達(dá)式”)).start();

1.8Lambda表達(dá)式和匿名內(nèi)部類(lèi)的區(qū)別

  • 所需類(lèi)型不同
    匿名內(nèi)部類(lèi):可以是接口,也可以是抽象類(lèi),還可以是具體類(lèi)
    Lambda表達(dá)式:只能是接口
  • 使用限制不同
    如果接口中有且僅有一個(gè)抽象方法,可以使用Lambda表達(dá)式,也可以使用匿名內(nèi)部類(lèi)
    如果接口中多于一個(gè)抽象方法,只能使用匿名內(nèi)部類(lèi),而不能使用Lambda表達(dá)式
  • 實(shí)現(xiàn)原理不同
    匿名內(nèi)部類(lèi):編譯之后,產(chǎn)生一個(gè)單獨(dú)的.class字節(jié)碼文件
    Lambda表達(dá)式:編譯之后,沒(méi)有一個(gè)單獨(dú)的.class字節(jié)碼文件。對(duì)應(yīng)的字節(jié)碼會(huì)在運(yùn)行的時(shí)候動(dòng)態(tài)生成

2.接口組成更新

2.1接口組成更新概述

  • 常量
    public static final
  • 抽象方法
    public abstract
  • 默認(rèn)方法(Java 8)
  • 靜態(tài)方法(Java 8)
  • 私有方法(Java 9)

2.2接口中默認(rèn)方法

  • 格式
    public default 返回值類(lèi)型 方法名(參數(shù)列表) { }
  • 范例
public default void show3() { }
  • 注意事項(xiàng)
    默認(rèn)方法不是抽象方法,所以不強(qiáng)制被重寫(xiě)。但是可以被重寫(xiě),重寫(xiě)的時(shí)候去掉default關(guān)鍵字
    public可以省略,default不能省略

2.3接口中靜態(tài)方法

  • 格式
    public static 返回值類(lèi)型 方法名(參數(shù)列表) { }
  • 范例
public static void show() { }
  • 注意事項(xiàng)
    靜態(tài)方法只能通過(guò)接口名調(diào)用,不能通過(guò)實(shí)現(xiàn)類(lèi)名或者對(duì)象名調(diào)用
    public可以省略,static不能省略

2.4接口中私有方法

  • 私有方法產(chǎn)生原因
    Java 9中新增了帶方法體的私有方法,這其實(shí)在Java 8中就埋下了伏筆:Java 8允許在接口中定義帶方法體的默認(rèn)方法和靜態(tài)方法。這樣可能就會(huì)引發(fā)一個(gè)問(wèn)題:當(dāng)兩個(gè)默認(rèn)方法或者靜態(tài)方法中包含一段相同的代碼實(shí)現(xiàn)時(shí),程序必然考慮將這段實(shí)現(xiàn)代碼抽取成一個(gè)共性方法,而這個(gè)共性方法是不需要讓別人使用的,因此用私有給隱藏起來(lái),這就是Java 9增加私有方法的必然性
  • 定義格式
    格式1
    private 返回值類(lèi)型 方法名(參數(shù)列表) { }
    范例1
private void show() { }

格式2
private static 返回值類(lèi)型 方法名(參數(shù)列表) { }
范例2

private static void method() { }
  • 注意事項(xiàng)
    默認(rèn)方法可以調(diào)用私有的靜態(tài)方法和非靜態(tài)方法
    靜態(tài)方法只能調(diào)用私有的靜態(tài)方法

3.方法引用

3.1體驗(yàn)方法引用

  • 方法引用的出現(xiàn)原因
    在使用Lambda表達(dá)式的時(shí)候,我們實(shí)際上傳遞進(jìn)去的代碼就是一種解決方案:拿參數(shù)做操作
    那么考慮一種情況:如果我們?cè)贚ambda中所指定的操作方案,已經(jīng)有地方存在相同方案,那是否還有必要再
    寫(xiě)重復(fù)邏輯呢?答案肯定是沒(méi)有必要
    那我們又是如何使用已經(jīng)存在的方案的呢?
    這就是我們要講解的方法引用,我們是通過(guò)方法引用來(lái)使用已經(jīng)存在的方案

  • 代碼演示

public class Printdemo {public static void main(String[] args) {//在主方法中調(diào)用usePrintable方法usePrintable((String s) -> {System.out.println(s);});//Lambda簡(jiǎn)化寫(xiě)法usePrintable(s -> System.out.println(s));//方法引用usePrintable(System.out::println);}private static void usePrintable(Printable p ){p.printString("我愛(ài)Java");} }

3.2方法引用符

  • 方法引用符
    :: 該符號(hào)為引用運(yùn)算符,而它所在的表達(dá)式被稱為方法引用
  • 推導(dǎo)與省略
    如果使用Lambda,那么根據(jù)“可推導(dǎo)就是可省略”的原則,無(wú)需指定參數(shù)類(lèi)型,也無(wú)需指定的重載形式,
    它們都將被自動(dòng)推導(dǎo)
    如果使用方法引用,也是同樣可以根據(jù)上下文進(jìn)行推導(dǎo)
    方法引用是Lambda的孿生兄弟

3.3引用類(lèi)方法

引用類(lèi)方法,其實(shí)就是引用類(lèi)的靜態(tài)方法

  • 格式
    類(lèi)名::靜態(tài)方法
  • 范例
    Integer::parseInt
    Integer類(lèi)的方法:public static int parseInt(String s) 將此String轉(zhuǎn)換為int類(lèi)型數(shù)據(jù)
  • 練習(xí)描述
    定義一個(gè)接口(Converter),里面定義一個(gè)抽象方法 int convert(String s);
    定義一個(gè)測(cè)試類(lèi)(ConverterDemo),在測(cè)試類(lèi)中提供兩個(gè)方法
    ?一個(gè)方法是:useConverter(Converter c)
    ?一個(gè)方法是主方法,在主方法中調(diào)用useConverter方法
  • 代碼演示
public interface Converter {int convert(String s); }public class Converterdemo {public static void main(String[] args) {//Lambda寫(xiě)法Converter(s -> Integer.parseInt(s));//引用類(lèi)方法Converter(Integer::parseInt);}private static void Converter(Converter c){int number = c.convert("666");System.out.println(number);} }
  • 使用說(shuō)明
    Lambda表達(dá)式被類(lèi)方法替代的時(shí)候,它的形式參數(shù)全部傳遞給靜態(tài)方法作為參數(shù)

3.4引用對(duì)象的實(shí)例方法

引用對(duì)象的實(shí)例方法,其實(shí)就引用類(lèi)中的成員方法

  • 格式
    對(duì)象::成員方法
  • 范例
    “HelloWorld”::toUpperCase
    String類(lèi)中的方法:public String toUpperCase() 將此String所有字符轉(zhuǎn)換為大寫(xiě)
  • 練習(xí)描述
    定義一個(gè)類(lèi)(PrintString),里面定義一個(gè)方法
    ? public void printUpper(String s):把字符串參數(shù)變成大寫(xiě)的數(shù)據(jù),然后在控制臺(tái)輸出
    定義一個(gè)接口(Printer),里面定義一個(gè)抽象方法
    ? void printUpperCase(String s)
    定義一個(gè)測(cè)試類(lèi)(PrinterDemo),在測(cè)試類(lèi)中提供兩個(gè)方法
    ? 一個(gè)方法是:usePrinter(Printer p)
    ? 一個(gè)方法是主方法,在主方法中調(diào)用usePrinter方法
  • 代碼演示
public class PrintString {//把字符串參數(shù)變成大寫(xiě)的數(shù)據(jù),然后在控制臺(tái)輸出public void printupper(String s){String result = s.toUpperCase();System.out.println(result);} }public interface Printer {void printuppercase(String s); }public class PrintStringdemo {public static void main(String[] args) {//Lambda簡(jiǎn)化寫(xiě)法useprinter(s -> System.out.println(s.toUpperCase()));//引用對(duì)象的實(shí)例方法PrintString ps = new PrintString();useprinter(ps::printupper);}private static void useprinter(Printer p){p.printuppercase("helloworld");} }
  • 使用說(shuō)明
    Lambda表達(dá)式被對(duì)象的實(shí)例方法替代的時(shí)候,它的形式參數(shù)全部傳遞給該方法作為參數(shù)

3.5引用類(lèi)的實(shí)例方法

引用類(lèi)的實(shí)例方法,其實(shí)就是引用類(lèi)中的成員方法

  • 格式
    類(lèi)名::成員方法
  • 范例
    String::substring
    public String substring(int beginIndex,int endIndex)
    從beginIndex開(kāi)始到endIndex結(jié)束,截取字符串。返回一個(gè)子串,子串的長(zhǎng)度為endIndex-beginIndex
  • 練習(xí)描述
    定義一個(gè)接口(MyString),里面定義一個(gè)抽象方法:
    ?? String mySubString(String s,int x,int y);
    定義一個(gè)測(cè)試類(lèi)(MyStringDemo),在測(cè)試類(lèi)中提供兩個(gè)方法
    ??一個(gè)方法是:useMyString(MyString my)
    ??一個(gè)方法是主方法,在主方法中調(diào)用useMyString方法
  • 代碼演示
public interface MyString {String mysubString(String s,int x,int y); }public class MyStringDemo {public static void main(String[] args) {//Lambda簡(jiǎn)化寫(xiě)法usemyString((s, x, y) -> s.substring(x,y));//引用類(lèi)的實(shí)例方法usemyString(String::substring);}private static void usemyString(MyString my){System.out.println(my.mysubString("helloworld",2,5));} }
  • 使用說(shuō)明
    Lambda表達(dá)式被類(lèi)的實(shí)例方法替代的時(shí)候 第一個(gè)參數(shù)作為調(diào)用者 后面的參數(shù)全部傳遞給該方法作為參數(shù)

3.6引用構(gòu)造器【應(yīng)用】

引用構(gòu)造器,其實(shí)就是引用構(gòu)造方法

  • l格式
    類(lèi)名::new
  • 范例
    Student::new
  • 練習(xí)描述
    定義一個(gè)類(lèi)(Student),里面有兩個(gè)成員變量(name,age)
    ??并提供無(wú)參構(gòu)造方法和帶參構(gòu)造方法,以及成員變量對(duì)應(yīng)的get和set方法
    定義一個(gè)接口(StudentBuilder),里面定義一個(gè)抽象方法
    ??Student build(String name,int age);
    定義一個(gè)測(cè)試類(lèi)(StudentDemo),在測(cè)試類(lèi)中提供兩個(gè)方法
    ??一個(gè)方法是:useStudentBuilder(StudentBuilder s)
    ??一個(gè)方法是主方法,在主方法中調(diào)用useStudentBuilder方法
  • 代碼演示
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} }public interface StudentBuilder {Student builder(String name,int age); }public class Studentdemo {public static void main(String[] args) {//Lambda簡(jiǎn)化寫(xiě)法useStudentBuilder(((name, age) -> new Student(name,age)));//引用構(gòu)造器useStudentBuilder(Student::new);}private static void useStudentBuilder(StudentBuilder sb) {Student s = sb.builder("林青霞",30);System.out.println(s.getName() + "," + s.getAge());} }
  • 使用說(shuō)明
    Lambda表達(dá)式被構(gòu)造器替代的時(shí)候,它的形式參數(shù)全部傳遞給構(gòu)造器作為參數(shù)

總結(jié)

以上是生活随笔為你收集整理的Java基础day22的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。