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

歡迎訪問 生活随笔!

生活随笔

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

java

【JavaSE】Lambda表达式、接口组成更新、方法引用

發(fā)布時間:2024/3/13 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JavaSE】Lambda表达式、接口组成更新、方法引用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1. Lambda表達(dá)式
      • 1.1 Lambda表達(dá)式初體驗
      • 1.2 Lambda表達(dá)式的基本格式
      • 1.3 Lambda表達(dá)式練習(xí)
      • 1.4 Lambda表達(dá)式的省略規(guī)則
      • 1.5 Lambda表達(dá)式的注意事項
      • 1.6 Lambda表達(dá)式和匿名內(nèi)部類的區(qū)別
    • 2. 接口組成更新
      • 2.1 接口組成更新概述
      • 2.2 接口中默認(rèn)方法應(yīng)用
      • 2.3 接口中靜態(tài)方法應(yīng)用
      • 2.4 接口中私有方法應(yīng)用
    • 3. 方法引用
      • 3.1 方法引用初體驗
      • 3.2 方法引用符
      • 3.3 方法引用類對象練習(xí)
      • 3.4 方法引用對象的實例方法
      • 3.5 方法引用類的實例方法
      • 3.6 引用構(gòu)造方法

1. Lambda表達(dá)式

1.1 Lambda表達(dá)式初體驗

案例需求
啟動一個線程,在控制臺輸出一句話:多線程程序啟動了

實現(xiàn)方式一
實現(xiàn)步驟
定義一個類MyRunnable實現(xiàn)Runnable接口,重寫run()方法
創(chuàng)建MyRunnable類的對象
創(chuàng)建Thread類的對象,把MyRunnable的對象作為構(gòu)造參數(shù)傳遞
啟動線程

實現(xiàn)方式二
匿名內(nèi)部類的方式改進(jìn)

實現(xiàn)方式三
Lambda表達(dá)式的方式改進(jìn)

public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("多線程程序啟動了");} } public class LambdaDemo {public static void main(String[] args) {//實現(xiàn)類的方式實現(xiàn)需求 // MyRunnable my = new MyRunnable(); // Thread t = new Thread(my); // t.start();//匿名內(nèi)部類的方式改進(jìn) // new Thread(new Runnable() { // @Override // public void run() { // System.out.println("多線程程序啟動了"); // } // }).start();//Lambda表達(dá)式的方式改進(jìn)new Thread( () -> {System.out.println("多線程程序啟動了");} ).start();} }

函數(shù)式編程思想概述

函數(shù)式思想則盡量忽略面向?qū)ο蟮膹?fù)雜語法:“強(qiáng)調(diào)做什么,而不是以什么形式去做”而我們要學(xué)習(xí)的Lambda表達(dá)式就是函數(shù)式思想的體現(xiàn)

1.2 Lambda表達(dá)式的基本格式

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

練習(xí)一:

定義一個接口(Eatable),里面定義一個抽象方法:void eat();
定義一個測試類(EatableDemo),在測試類中提供兩個方法 一個方法是:useEatable(Eatable e)
一個方法是主方法,在主方法中調(diào)用useEatable方法

public interface Eatable {void eat(); } public class EatableImpl implements Eatable {@Overridepublic void eat() {System.out.println("一天一蘋果,醫(yī)生遠(yuǎn)離我");} } public class EatableDemo {public static void main(String[] args) {//在主方法中調(diào)用useEatable方法Eatable e = new EatableImpl();useEatable(e);//匿名內(nèi)部類useEatable(new Eatable() {@Overridepublic void eat() {System.out.println("一天一蘋果,醫(yī)生遠(yuǎn)離我");}});//Lambda表達(dá)式useEatable(() -> {System.out.println("一天一蘋果,醫(yī)生遠(yuǎn)離我");});}private static void useEatable(Eatable e) {e.eat();} }

練習(xí)二:有參有返回值抽象方法的練習(xí)
定義一個接口(Addable),里面定義一個抽象方法:int add(int x,int y);
定義一個測試類(AddableDemo),在測試類中提供兩個方法 一個方法是:useAddable(Addable a)
一個方法是主方法,在主方法中調(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((int x,int y) -> {return x + y; // return x - y;});}private static void useAddable(Addable a) {int sum = a.add(10, 20);System.out.println(sum);} }


其實,lambda表達(dá)式的代碼塊就是抽象方法的實現(xiàn) 形式。

1.4 Lambda表達(dá)式的省略規(guī)則


代碼演示

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ù)的類型可以省略useAddable((x, y) -> {return x + y;});//但是有多個參數(shù)的情況下,不能只省略一個 // useAddable((x,int y) -> { // return x + y; // });// useFlyable((String s) -> { // System.out.println(s); // }); // useFlyable((s) -> { // System.out.println(s); // });//如果參數(shù)有且僅有一個,那么小括號可以省略 // useFlyable(s -> { // System.out.println(s); // });//如果代碼塊的語句只有一條,可以省略大括號和分號useFlyable(s -> System.out.println(s));//如果代碼塊的語句只有一條,可以省略大括號和分號,如果有return,return也要省略掉useAddable((x, y) -> x + y);}private static void useFlyable(Flyable f) {f.fly("風(fēng)和日麗,晴空萬里");}private static void useAddable(Addable a) {int sum = a.add(10, 20);System.out.println(sum);} }

1.5 Lambda表達(dá)式的注意事項

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

2. 接口組成更新

2.1 接口組成更新概述

常量 public static final抽象方法 public abstract默認(rèn)方法(Java 8) public default 返回值類型 方法名(參數(shù)列表) { }靜態(tài)方法(Java 8) public static 返回值類型 方法名(參數(shù)列表) { }私有方法(Java 9) private 返回值類型 方法名(參數(shù)列表) { }

2.2 接口中默認(rèn)方法應(yīng)用

public interface MyInterface {void show1();void show2(); }public class MyInterfaceImplOne implements MyInterface {@Overridepublic void show1() {System.out.println("One show1");}@Overridepublic void show2() {System.out.println("One show2");} }public class MyInterfaceDemo {public static void main(String[] args) {//按照多態(tài)的方式創(chuàng)建對象并使用MyInterface my = new MyInterfaceImplOne();my.show1();my.show2();} }

如果我們在接口中新增抽象方法,就必須在實現(xiàn)類中重寫抽象方法,否則編譯無法通過,有沒有什么辦法解決呢?

在JDK8中,引入了默認(rèn)方法,如果抽線方法被設(shè)置為默認(rèn)方法,就不需要在實現(xiàn)類中進(jìn)行實現(xiàn)。但是,也可以在實現(xiàn)類中重寫抽象方法。

public interface MyInterface {void show1();void show2();// void show3();// public default void show3() { // System.out.println("show3"); // }default void show3() {System.out.println("show3");} }public class MyInterfaceDemo {public static void main(String[] args) {//按照多態(tài)的方式創(chuàng)建對象并使用MyInterface my = new MyInterfaceImplOne();my.show1();my.show2();my.show3();} }

2.3 接口中靜態(tài)方法應(yīng)用

public interface Inter {void show();default void method(){System.out.println("Inter 中的默認(rèn)方法執(zhí)行了");}// public static void test(){ // System.out.println("Inter 中的靜態(tài)方法執(zhí)行了"); // }static void test(){System.out.println("Inter 中的靜態(tài)方法執(zhí)行了");} }public interface Flyable {public static void test() {System.out.println("Flyable 中的靜態(tài)方法執(zhí)行了");} }public class InterImpl implements Inter,Flyable {@Overridepublic void show() {System.out.println("show方法執(zhí)行了");} }public class InterDemo {public static void main(String[] args) {//按照多態(tài)的方式創(chuàng)建對象并使用Inter i = new InterImpl();i.show();i.method(); // i.test();Inter.test(); // InterImpl.test();Flyable.test();} }

2.4 接口中私有方法應(yīng)用

私有方法產(chǎn)生原因

Java 9中新增了帶方法體的私有方法,這其實在Java 8中就埋下了伏筆:Java 8允許在接口中定義帶方法體的默認(rèn)方法和靜態(tài)方法。這樣可能就會引發(fā)一個問題:當(dāng)兩個默認(rèn)方法或者靜態(tài)方法中包含一段相同的代碼實
現(xiàn)時,程序必然考慮將這段實現(xiàn)代碼抽取成一個共性方法,而這個共性方法是不需要讓別人使用的,因此用私有給隱藏起來
,這就是Java 9增加私有方法的必然性。

public interface Inter {default void show1() {System.out.println("show1開始執(zhí)行"); // System.out.println("初級工程師"); // System.out.println("中級工程師"); // System.out.println("高級工程師"); // show();method();//默認(rèn)方法可以調(diào)用私有的靜態(tài)方法和非靜態(tài)方法System.out.println("show1結(jié)束執(zhí)行");}default void show2() {System.out.println("show2開始執(zhí)行"); // System.out.println("初級工程師"); // System.out.println("中級工程師"); // System.out.println("高級工程師"); // show();method();System.out.println("show2結(jié)束執(zhí)行");}private void show() {System.out.println("初級工程師");System.out.println("中級工程師");System.out.println("高級工程師");}static void method1() {System.out.println("method1開始執(zhí)行"); // System.out.println("初級工程師"); // System.out.println("中級工程師"); // System.out.println("高級工程師"); // show();method();//靜態(tài)方法只能調(diào)用靜態(tài)方法,而不能調(diào)用非靜態(tài)方法System.out.println("method1結(jié)束執(zhí)行");}static void method2() {System.out.println("method2開始執(zhí)行"); // System.out.println("初級工程師"); // System.out.println("中級工程師"); // System.out.println("高級工程師");method();System.out.println("method2結(jié)束執(zhí)行");}private static void method() {System.out.println("初級工程師");System.out.println("中級工程師");System.out.println("高級工程師");} }public class InterImpl implements Inter { }public class InterDemo {public static void main(String[] args) {//按照多態(tài)的方式創(chuàng)建對象并使用Inter i = new InterImpl();i.show1();System.out.println("--------");i.show2();System.out.println("--------");Inter.method1();System.out.println("--------");Inter.method2();} }

3. 方法引用

3.1 方法引用初體驗

方法引用的出現(xiàn)原因

在使用Lambda表達(dá)式的時候,我們實際上傳遞進(jìn)去的代碼就是一種解決方案:拿參數(shù)做操作

那么考慮一種情況:如果我們在Lambda中所指定的操作方案,已經(jīng)有地方存在相同方案,那是否還有必要再寫重復(fù)邏輯呢?答案肯定是沒有必要

那我們又是如何使用已經(jīng)存在的方案的呢?
這就是我們要講解的方法引用,我們是通過方法引用來使用已經(jīng)存在的方案

public interface Printable {void printString(String s); }public class PrintableDemo {public static void main(String[] args) {//在主方法中調(diào)用usePrintable方法// usePrintable((String s) -> { // System.out.println(s); // });usePrintable(s -> System.out.println(s));// System.out.println("愛生活愛Java");//方法引用符:::usePrintable(System.out::println);//可推導(dǎo)的就是可省略的}private static void usePrintable(Printable p) {p.printString("愛生活愛Java");} }

3.2 方法引用符

3.3 方法引用類對象練習(xí)


將字符串轉(zhuǎn)成數(shù)值輸出

public interface Converter {int convert(String s); }public class ConverterDemo {public static void main(String[] args) {//在主方法中調(diào)用useConverter方法// useConverter((String s) -> { // return Integer.parseInt(s); // });useConverter(s -> Integer.parseInt(s));//引用類方法useConverter(Integer::parseInt);//Lambda表達(dá)式被類方法替代的時候,它的形式參數(shù)全部傳遞給靜態(tài)方法作為參數(shù)}private static void useConverter(Converter c) {int number = c.convert("666");System.out.println(number);} }

使用說明:

Lambda表達(dá)式被類方法替代的時候,它的形式參數(shù)全部傳遞給靜態(tài)方法作為參數(shù)

3.4 方法引用對象的實例方法

public class PrintString {//把字符串參數(shù)變成大寫的數(shù)據(jù),然后在控制臺輸出public void printUpper(String s) {String result = s.toUpperCase();System.out.println(result);} }public interface Printer {void printUpperCase(String s); }public class PrinterDemo {public static void main(String[] args) {//在主方法中調(diào)用usePrinter方法// usePrinter((String s) -> { String result = s.toUpperCase(); System.out.println(result); // System.out.println(s.toUpperCase()); // });usePrinter(s -> System.out.println(s.toUpperCase()));//引用對象的實例方法PrintString ps = new PrintString();usePrinter(ps::printUpper);//Lambda表達(dá)式被對象的實例方法替代的時候,它的形式參數(shù)全部傳遞給該方法作為參數(shù)}private static void usePrinter(Printer p) {p.printUpperCase("HelloWorld");} }


使用說明:

Lambda表達(dá)式被對象的實例方法替代的時候,它的形式參數(shù)全部傳遞給該方法作為參數(shù)

3.5 方法引用類的實例方法

public interface MyString {String mySubString(String s,int x,int y); }public class MyStringDemo {public static void main(String[] args) {//在主方法中調(diào)用useMyString方法// useMyString((String s,int x,int y) -> { // return s.substring(x,y); // });useMyString((s,x,y) -> s.substring(x,y));//引用類的實例方法useMyString(String::substring);//Lambda表達(dá)式被類的實例方法替代的時候//第一個參數(shù)作為調(diào)用者//后面的參數(shù)全部傳遞給該方法作為參數(shù)}private static void useMyString(MyString my) {String s = my.mySubString("HelloWorld", 2, 5);System.out.println(s);} }


Lambda表達(dá)式被類的實例方法替代的時候 第一個參數(shù)作為調(diào)用者 后面的參數(shù)全部傳遞給該方法作為參數(shù)

3.6 引用構(gòu)造方法

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 build(String name,int age); }public class StudentDemo {public static void main(String[] args) {//在主方法中調(diào)用useStudentBuilder方法// useStudentBuilder((String name,int age) -> { Student s = new Student(name,age); return s; // return new Student(name,age); // });useStudentBuilder((name,age) -> new Student(name,age));//引用構(gòu)造器useStudentBuilder(Student::new);//Lambda表達(dá)式被構(gòu)造器替代的時候,它的形式參數(shù)全部傳遞給構(gòu)造器作為參數(shù)}private static void useStudentBuilder(StudentBuilder sb) {Student s = sb.build("Adrian", 18);System.out.println(s.getName() + "," + s.getAge());} }

Lambda表達(dá)式被構(gòu)造器替代的時候,它的形式參數(shù)全部傳遞給構(gòu)造器作為參數(shù)

總結(jié)

以上是生活随笔為你收集整理的【JavaSE】Lambda表达式、接口组成更新、方法引用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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