Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】
- 視頻+資料【鏈接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg? ?提取碼:zjxs】
- Java基礎--學習筆記(零起點打開java世界的大門)--博客匯總表
? ?? ??
目? ?錄
01_函數式接口
1.1、函數式接口概述
02_函數式接口作為方法的參數
1.2、函數式接口作為方法的參數
03_函數式接口作為方法的返回值
1.3、函數式接口作為方法的返回值
04_常用函數式接口之Supplier
1.4、常用的函數式接口
1.5、Supplier接口
05_Supplier接口練習之獲取最大值
1.5、Supplier接口
06_常用函數式接口之Consumer
1.6、Consumer接口
07_Consumer接口練習之按要求打印信息
1.6、Consumer接口
08_常用函數式接口之Predicate(1)
1.7、Predicate接口
09_常用函數式接口之Predicate(2)
1.7、Predicate接口
10_Predicate接口練習之篩選滿足條件數據
1.7、Predicate接口
11_常用函數式接口之Function
1.8、Function接口
12_Function接口練習之按照指定要求操作數據
1.8、Function接口
13_體驗Stream流
1.1、體驗Stream流
14_Stream流的常見生成方式
1.2、Stream流的常見生成方式
15_Stream流中間操作之filter
1.3、Stream流的常見中間操作方法
16_Stream流中間操作之limit&skip
1.3、Stream流的常見中間操作方法
17_Stream流中間操作之concat&distinct
1.3、Stream流的常見中間操作方法
18_Stream流中間操作之sorted
1.3、Stream流的常見中間操作方法
19_Stream流中間操作之map&mapToInt
1.3、Stream流的常見中間操作方法
20_Stream流終結
1.4、Stream流的常見終結操作方法
21_Stream流綜合練習操作之forEach&count
1.5、Stream流的練習
22_Stream流的收集操作
1.6、Stream流的收集操作
01_函數式接口
1.1、函數式接口概述
函數式接口概念:有且僅有一個抽象方法的接口。
Java中的函數式編程體現就是Lambda表達式,所以函數式接口就是可以適用于Lambda使用的接口。
只有確保接口中有且僅有一個抽象方法,Java中的Lambda才能順利地進行推導。
如何檢測一個接口是不是函數式接口:
- @FunctionalInterface
- 放在接口定義的上方:如果接口是函數式接口,編譯通過;如果不是,編譯失敗。
注意事項:
- 我們自己定義函數式接口的時候,@FunctionalInterface是可選的,就算我不寫這個注解,只要保證滿足函數式接口定義的條件,也照樣是函數式接口。但是,建議加上該注解。
? ?報錯:有多個抽象方法在這個接口中。
02_函數式接口作為方法的參數
1.2、函數式接口作為方法的參數
需求
- 定義一個類(RunnableDemo),在類中提供兩個方法:
一個方法是:startThread(Runnable r) ? 方法參數Runnable是一個函數式接口。
一個方法是主方法,在主方法中調用startThread方法。
如果方法的參數是一個函數式接口,我們可以使用Lambda表達式作為參數傳遞。
- startThread(() -> System.out.printIn(Thread.currentThread().getName() + "線程啟動了"));
03_函數式接口作為方法的返回值
1.3、函數式接口作為方法的返回值
需求描述
- 定義一個類(ComparatorDemo),在類中提供兩個方法:
一個方法是:Comparator<String>?getComparator()? ?方法返回值Comparator是一個函數式接口。
一個方法是主方法,在主方法中調用getComparator方法。
如果方法的返回值是一個函數式接口,我們可以使用Lambda表達式作為結果返回。
- private static Comparator<String> getComparator() {
? ? ? ? return (s1, s2) -> s1.length() - s2.length();
}
?比較器排序接口
04_常用函數式接口之Supplier
1.4、常用的函數式接口
Java8在java.util.function包下預定義了大量的函數式接口供我們使用。
我們重點來學習下面的4個接口:
- Supplier接口
- Consumer接口
- Predicate接口
- Function接口
1.5、Supplier接口
Supplier<T>:包含一個無參的方法。
- T get():獲得結果。
- 該方法不需要參數,它會按照某種實現邏輯(由Lambda表達式實現)返回一個數據。
- Supplier<T>接口也被稱為生產型接口,如果我們指定了接口的泛型是什么類型,那么接口中的get方法就會生產什么類型的數據供我們使用。
常用方法:只有一個無參的方法。
????
05_Supplier接口練習之獲取最大值
1.5、Supplier接口
Supplier<T>:包含一個無參的方法。
- T get():獲得結果。
- 該方法不需要參數,它會按照某種實現邏輯(由Lambda表達式實現)返回一個數據。
- Supplier<T>接口也被稱為生產型接口,如果我們指定了接口的泛型是什么類型,那么接口中的get方法就會生產什么類型的數據供我們使用。
練習(案例需求)
- 定義一個類(SupplierTest),在類中提供兩個方法:
一個方法是:int getMax(Supplier<Integer> sup) 用于返回一個int數組中的最大值
一個方法是主方法,在主方法中調用getMax方法
06_常用函數式接口之Consumer
1.6、Consumer接口
Consumer<T>:包含兩個方法。
- void accept(T t):對給定的參數執行此操作。
- default Consumer<T> andThen(Consumer after):返回一個組合的Consumer,依次執行此操作,然后執行 after操作。
- Consumer<T>接口也被稱為消費型接口,它消費的數據的數據類型由泛型指定。
07_Consumer接口練習之按要求打印信息
1.6、Consumer接口
Consumer<T>:包含兩個方法。
- void accept(T t):對給定的參數執行此操作。
- default Consumer<T> andThen(Consumer after):返回一個組合的Consumer,依次執行此操作,然后執行 after操作。
- Consumer<T>接口也被稱為消費型接口,它消費的數據的數據類型由泛型指定。
練習(案例需求)
- String[] strArray = {"林青霞,30", "張曼玉,35", "王祖賢,33"};
- 字符串數組中有多條信息,請按照格式:“姓名:XX,年齡:XX"的格式將信息打印出來。
- 要求:
把打印姓名的動作作為第一個Consumer接口的Lambda實例。
把打印年齡的動作作為第二個Consumer接口的Lambda實例。
將兩個Consumer接口按照順序組合到一起使用。
08_常用函數式接口之Predicate(1)
1.7、Predicate接口
Predicate<T>:常用的四個方法:
- boolean test(T t):對給定的參數進行判斷(判斷邏輯由Lambda表達式實現),返回一個布爾值。
- default Predicate<T> negate():返回一個邏輯的否定,對應邏輯非。
- default Predicate<T> and(Predicate other):返回一個組合判斷,對應短路與。
- default Predicate<T> or(Predicate other):返回一個組合判斷,對應短路或。
- Predicate<T>接口通常用于判斷參數是否滿足指定的條件。
?
09_常用函數式接口之Predicate(2)
1.7、Predicate接口
Predicate<T>:常用的四個方法:
- boolean test(T t):對給定的參數進行判斷(判斷邏輯由Lambda表達式實現),返回一個布爾值。
- default Predicate<T> negate():返回一個邏輯的否定,對應邏輯非。
- default Predicate<T> and(Predicate other):返回一個組合判斷,對應短路與。
- default Predicate<T> or(Predicate other):返回一個組合判斷,對應短路或。
- Predicate<T>接口通常用于判斷參數是否滿足指定的條件。
10_Predicate接口練習之篩選滿足條件數據
1.7、Predicate接口
Predicate<T>:常用的四個方法:
- boolean test(T t):對給定的參數進行判斷(判斷邏輯由Lambda表達式實現),返回一個布爾值。
- default Predicate<T> negate():返回一個邏輯的否定,對應邏輯非。
- default Predicate<T> and(Predicate other):返回一個組合判斷,對應短路與。
- default Predicate<T> or(Predicate other):返回一個組合判斷,對應短路或。
- Predicate<T>接口通常用于判斷參數是否滿足指定的條件。
練習描述
- String[] strArray = {"林青霞,30", "柳巖,34", "張曼玉,35", "貂蟬,31", "王祖賢,33"};
- 字符串數組中有多條信息,請通過Predicate接口的拼裝 將符合要求的字符串篩選到集合ArrayList中,并遍歷ArrayList集合。
- 同時滿足如下要求:姓名長度大于2;年齡大于33。
- 分析
1.有兩個判斷條件,所以需要使用兩個Predicate接口,對條件進行判斷。
2.必須同時滿足兩個條件,所以可以使用and方法連接兩個判斷條件。
11_常用函數式接口之Function
1.8、Function接口
Function<T,R>:常用的兩個方法:
- R apply?(T t):將此函數應用于給定的參數。
- default <V> Function andThen?(Function after):返回一個組合函數,首先將該函數應用于輸入,然后將after函數應用于結果。
- Function<T,R>接口通常用于對參數進行處理,轉換(處理邏輯由Lambda表達式實現),然后返回一個新的值。
? ?
12_Function接口練習之按照指定要求操作數據
1.8、Function接口
Function<T,R>:常用的兩個方法:
- R apply?(T t):將此函數應用于給定的參數。
- default <V> Function andThen?(Function after):返回一個組合函數,首先將該函數應用于輸入,然后將after函數應用于結果。
- Function<T,R>接口通常用于對參數進行處理,轉換(處理邏輯由Lambda表達式實現),然后返回一個新的值。
練習描述
- String s = "林青霞,30";
- 請按照指定的要求進行操作:
- 請通過Function接口來實現函數拼接
13_體驗Stream流
1.1、體驗Stream流
案例需求:按照下面的要求完成集合的創建和遍歷。
使用Stream流的方式完成過濾操作(Stream流的好處):
- list.stream().filter(s -> s.startsWith("張")).filter(s -> s.length() == 3).forEach(System.out::println);
- 直接閱讀代碼的字面意思,即可完美展示無關邏輯方式的語義:獲取流、過濾姓張、過濾長度為3、逐一打印。
- Stream流把真正的函數式編程風格引入到Java中。
14_Stream流的常見生成方式
1.2、Stream流的常見生成方式
Stream流的思想
Stream流的使用
- 生成流
通過數據源(集合、數組等)生成流
list.stream()
- 中間操作
一個流后面可以跟隨零個或多個中間操作,其目的主要是打開流,做出某種程度的數據過濾/映射,然后返回一個新的流,交給下一個操作使用
filter()
- 終結操作
Stream流的常見生成方式
default Stream<E> stream?()
15_Stream流中間操作之filter
1.3、Stream流的常見中間操作方法
概念:中間操作的意思是,執行完此方法之后,Stream流依然可以繼續執行其他操作。
- Stream<T> filter?(Predicate predicate):用于對流中的數據進行過濾。
Predicate接口中的方法?? ?boolean test?(T t):對給定的參數進行判斷,返回一個布爾值。
16_Stream流中間操作之limit&skip
1.3、Stream流的常見中間操作方法
- Stream<T> filter?(Predicate predicate):用于對流中的數據進行過濾。
Predicate接口中的方法?? ?boolean test?(T t):對給定的參數進行判斷,返回一個布爾值。
- Stream<T> limit?(long maxSize):返回此流中的元素組成的流,截取前指定參數個數的數據。
- Stream<T> skip?(long n):跳過指定參數個數的數據,返回由該流的剩余元素組成的流。
17_Stream流中間操作之concat&distinct
1.3、Stream流的常見中間操作方法
- Stream<T> filter?(Predicate predicate):用于對流中的數據進行過濾。
Predicate接口中的方法?? ?boolean test?(T t):對給定的參數進行判斷,返回一個布爾值。
- Stream<T> limit?(long maxSize):返回此流中的元素組成的流,截取前指定參數個數的數據。
- Stream<T> skip?(long n):跳過指定參數個數的數據,返回由該流的剩余元素組成的流。
- static <T> Stream<T> concat?(Stream a, Stream b):合并a和b兩個流為一個流。
- Stream<T> distinct?():返回由該流的不同元素(根據Object.equals(Object) )組成的流。
18_Stream流中間操作之sorted
1.3、Stream流的常見中間操作方法
- Stream<T> filter?(Predicate predicate):用于對流中的數據進行過濾。
Predicate接口中的方法?? ?boolean test?(T t):對給定的參數進行判斷,返回一個布爾值。
- Stream<T> limit?(long maxSize):返回此流中的元素組成的流,截取前指定參數個數的數據。
- Stream<T> skip?(long n):跳過指定參數個數的數據,返回由該流的剩余元素組成的流。
- static <T> Stream<T> concat?(Stream a, Stream b):合并a和b兩個流為一個流。
- Stream<T> distinct?():返回由該流的不同元素(根據Object.equals(Object) )組成的流。
- Stream<T> sorted?():返回由此流的元素組成的流,根據自然順序排序。
- Stream<T> sorted?(Comparator comparator):返回由該流的元素組成的流,根據提供的Comparator進行排序。
? ? ? ? Comparator接口中的方法?? ?int compare?(T o1, T o2)
19_Stream流中間操作之map&mapToInt
1.3、Stream流的常見中間操作方法
概念:中間操作的意思是,執行完此方法之后,Stream流依然可以繼續執行其他操作。
- Stream<T> filter?(Predicate predicate):用于對流中的數據進行過濾。
Predicate接口中的方法?? ?boolean test?(T t):對給定的參數進行判斷,返回一個布爾值。
- Stream<T> limit?(long maxSize):返回此流中的元素組成的流,截取前指定參數個數的數據。
- Stream<T> skip?(long n):跳過指定參數個數的數據,返回由該流的剩余元素組成的流。
- static <T> Stream<T> concat?(Stream a, Stream b):合并a和b兩個流為一個流。
- Stream<T> distinct?():返回由該流的不同元素(根據Object.equals(Object) )組成的流。
- Stream<T> sorted?():返回由此流的元素組成的流,根據自然順序排序。
- Stream<T> sorted?(Comparator comparator):返回由該流的元素組成的流,根據提供的Comparator進行排序。
Comparator接口中的方法?? ?int compare?(T o1, T o2)
- <R> Stream<R> map?(Function mapper):返回由給定函數應用于此流的元素的結果組成的流。
Function接口中的方法?? ??? ?R apply?(T t)
- IntStream mapToInt?(ToIntFunction mapper):返回一個IntStream其中包含將給定函數應用于此流的元素的結果。
IntStream:表示原始 int 流
ToIntFunction接口中的方法?? ? int applyAsInt?(T value)
20_Stream流終結
1.4、Stream流的常見終結操作方法
概念:終結操作的意思是,執行完此方法之后,Stream流將不能再執行其他操作。
- void forEach(Consumer action):對此流的每個元素執行操作。
Consumer接口中的方法?? ?void accept?(T t):對給定的參數執行此操作
- long count():返回此流中的元素數。
21_Stream流綜合練習操作之forEach&count
1.5、Stream流的練習
案例需求:現在有兩個ArrayList集合,分別存儲6名男演員名稱和6名女演員名稱,要求完成如下的操作:
演員類Actor已經提供,里面有一個成員變量,一個帶參構造方法,以及成員變量對應的get/set方法。
22_Stream流的收集操作
1.6、Stream流的收集操作
概念:對數據使用Stream流的方式操作完畢后,可以把流中的數據收集到集合中。
對數據使用Stream流的方式操作完畢后,我想把流中的數據收集到集合中,該怎么辦呢?
Stream流的收集方法:
- R collect?(Collector collector):把結果收集到集合中
- 但是這個收集方法的參數是一個Collector接口。
它是通過工具類Collectors提供了具體的收集方式:
- public static <T> Collector toList?():把元素收集到List集合中
- public static <T> Collector toSet?():把元素收集到Set集合中
- public static Collector toMap?(Function keyMapper,Function valueMapper):把元素收集到Map集合中
?
總結
以上是生活随笔為你收集整理的Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java22-day13【Lambda表
- 下一篇: Java24-day15(完结)【反射(