java複習第10天---10.2---常用函數式接口1
目錄
文章目錄
內容
1、函數式接口作爲參數和返回值
如果拋開實現原理不說,Java中的Lambda表達式可以被當做是匿名內部類的替代品。如果方法的參數是一個函數式接口類型,那麼就可以用Lambda表達式進行替代。
1.1、使用Lambda表達式作爲方法參數
使用Lambda表達式作爲方法參數,其實就是使用函數式接口作爲參數。
-
示例1-1:java.lang.Runnable接口作爲函數式接口
package feature.jdk8.lambda; public class TestLambdaPara1 { public static void main(String[] args) { startThread(() -> System.out.println("線程任務執行")); } // 開啓線程,執行任務 private static void startThread(Runnable task) { new Thread(task).start(); } } 測試結果: 線程任務執行
1.2、使用函數式接口作爲返回值類型
使用函數式接口作爲返回值類,可以直接返回一個Lambda表達式。
-
示例1.2-1:通過方法獲取一個java.util.Comparator接口類型的對象作爲排序器
-
需求:給定一個字符串數組,按照字符串長度降序排序
package feature.jdk8.lambda; import java.util.Arrays; import java.util.Comparator; public class TestLambdaAsReturnType { public static void main(String[] args) { String[] str = {"Hello", "Java", "C++", "Python", "World"}; System.out.println("排序前:" + Arrays.toString(str)); Arrays.sort(str, getComparator()); System.out.println("排序後:" + Arrays.toString(str)); } // 排序器:按字符串長度降序排列 private static Comparator<String> getComparator() { return (String s1, String s2) -> s2.length() - s1.length(); } } 測試結果: 排序前:[Hello, Java, C++, Python, World] 排序後:[Python, Hello, World, Java, C++]
2、Supplier
java.util.Supplier<T> 接口僅包含一個無參的方法:T get()。用來獲取一個泛型參數指定類型的對象數據。由於這是一個函數式接口,那麼可以使用Lambda表達式對外提供一個符合泛型類型的對象數據。
Supplier也被稱爲生產型接口,指定接口的泛型是什麼類型,就返回什麼類型的數據對象。
-
示例2-1:
package feature.jdk8.functionalinterface; import java.util.function.Supplier; public class TestSupplier1 { public static void main(String[] args) { String s1 = "Hello", s2 = "World"; System.out.println(stringConnect(() -> s1 +s2)); } public static String stringConnect(Supplier<String> str) { return str.get(); } } 測試結果: HelloWorld
3、Consumer
java.util.Consumer<T>接口正好與Supplier接口相反,他不是生產一個數據,而是消費一個數據,數據類型由泛型決定。
3.1、accept
- 抽象方法:
修飾符 | 返回值類型 | 方法 | 參數列表 | 描述 |
---|---|---|---|---|
public abstract | void | accept | T t | 消費一個指定的泛型數據 |
-
示例3-1:字符串反序輸出
package feature.jdk8.functionalinterface; import java.util.function.Consumer; public class TestConsumer1 { public static void main(String[] args) { consumerString("Hello", s -> System.out.println(new StringBuilder(s).reverse())); } public static void consumerString(String str, Consumer<String> con) { con.accept(str); } } 測試結果: olleH
-
解析:
- Consumer接口使用accept方法消費泛型指定的數據類型,至於怎麼消費,自己定義
3.2、andThen
andThen爲Comsumer接口中的默認方法
-
作用:消費數據的時候,先執行一個操作,在執行另外一個操作,實現組合效果,但是2個操作不好相互干擾。
-
注意:函數式接口不限制默認方法和靜態方法。
-
示例3.2-1:吧字符串全部大寫輸出然後全部小寫輸出
package feature.jdk8.functionalinterface; import java.util.function.Consumer; public class TestConsumerAndThen { public static void main(String[] args) { method("Hello", s -> System.out.println(s.toUpperCase()), s -> System.out.println(s.toLowerCase())); } public static void method(String s, Consumer<String> con1, Consumer<String> con2) { con1.andThen(con2).accept(s); } } 測試結果: HELLO hello
後記 :
本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785
前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA