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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】

發布時間:2024/9/30 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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";
  • 請按照指定的要求進行操作:
  • 將字符串截取得到數字年齡部分
  • 將上一步的年齡字符串轉換成為int類型的數據
  • 將上一步的int數據加70,得到一個int結果,在控制臺輸出
    • 請通過Function接口來實現函數拼接

    13_體驗Stream流

    1.1、體驗Stream流

    案例需求:按照下面的要求完成集合的創建和遍歷。

  • 創建一個集合,存儲多個字符串元素;
  • 把集合中所有以"張"開頭的元素存儲到一個新的集合;
  • 把"張"開頭的集合中的長度為3的元素存儲到一個新的集合;
  • 遍歷上一步得到的集合。
  • 使用Stream流的方式完成過濾操作(Stream流的好處):

    • list.stream().filter(s -> s.startsWith("張")).filter(s -> s.length() == 3).forEach(System.out::println);
    • 直接閱讀代碼的字面意思,即可完美展示無關邏輯方式的語義:獲取流、過濾姓張、過濾長度為3、逐一打印。
    • Stream流把真正的函數式編程風格引入到Java中。

    package com.itheima_01;import java.util.ArrayList;public class StreamDemo {public static void main(String[] args) {//1.創建一個集合,存儲多個字符串元素ArrayList<String> list = new ArrayList<String>();list.add("林青霞");list.add("張曼玉");list.add("王祖賢");list.add("柳巖");list.add("張敏");list.add("張無忌");//2.把集合中所有以"張"開頭的元素存儲到一個新的集合ArrayList<String> zhangList = new ArrayList<String>();for (String s : list) {if (s.startsWith("張")) {zhangList.add(s);}}System.out.println(zhangList);//3.把"張"開頭的集合中的長度為3的元素存儲到一個新的集合ArrayList<String> threeList = new ArrayList<String>();for (String s : zhangList) {if (s.length() == 3) {threeList.add(s);}}System.out.println(threeList);//4.遍歷上一步得到的集合for (String s : threeList) {System.out.println(s);}System.out.println("--------");//Stream流來改進list.stream().filter(s -> s.startsWith("張")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));list.stream().filter(s -> s.startsWith("張")).filter(s -> s.length() == 3).forEach(System.out::println);} }

    14_Stream流的常見生成方式

    1.2、Stream流的常見生成方式

    Stream流的思想

    Stream流的使用

    • 生成流
  • 通過數據源(集合、數組等)生成流

  • list.stream()

    • 中間操作
  • 一個流后面可以跟隨零個或多個中間操作,其目的主要是打開流,做出某種程度的數據過濾/映射,然后返回一個新的流,交給下一個操作使用

  • filter()

    • 終結操作
  • 一個流只能有一個終結操作,當這個操作執行后,流就被使用“光”了,無法再被操作。所以這必定是流的最后一個操作。
  • forEach()
  • Stream流的常見生成方式

  • Collection體系的集合可以使用默認方法stream?()生成流
  • default Stream<E> stream?()

  • Map體系的集合間接的生成流
  • 數組可以通過Stream接口的靜態方法of?(T... values)生成流
  • package com.itheima_02;import java.util.*; import java.util.stream.Stream;public class StreamDemo {public static void main(String[] args) {//1.Collection體系的集合可以使用默認方法stream?()生成流List<String> list = new ArrayList<String>();Stream<String> listStream = list.stream();Set<String> set = new HashSet<String>();Stream<String> setStream = set.stream();//2.Map體系的集合間接的生成流Map<String, Integer> map = new HashMap<String, Integer>();Stream<String> keyStream = map.keySet().stream();Stream<Integer> valueStream = map.values().stream();Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();//3.數組可以通過Stream接口的靜態方法of?(T... values)生成流String[] strArray = {"hello", "world", "java"};Stream<String> strArrayStream1 = Stream.of(strArray);Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");Stream<Integer> intStream = Stream.of(10, 20, 30);} }

    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名女演員名稱,要求完成如下的操作:

  • 男演員只要名字為3個字的前三人;
  • 女演員只要姓林的,并且不要第一個;
  • 把過濾后的男演員姓名和女演員姓名合并到一起;
  • 把上一步操作后的元素作為構造方法的參數創建演員對象,遍歷數據。
  • 演員類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集合中

    package com.itheima_06;import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream;public class CollectDemo {public static void main(String[] args) {//創建List集合對象List<String> list = new ArrayList<String>();list.add("林青霞");list.add("張曼玉");list.add("王祖賢");list.add("柳巖");//需求1:得到名字為3個字的流Stream<String> listStream = list.stream().filter(s -> s.length() == 3);//需求2:把使用Stream流操作完畢的數據收集到List集合中并遍歷List<String> names = listStream.collect(Collectors.toList());for (String name : names) {System.out.println(name);}//創建Set集合對象Set<Integer> set = new HashSet<Integer>();set.add(10);set.add(20);set.add(30);set.add(33);set.add(35);//需求3:得到年齡大于25的流Stream<Integer> setStream = set.stream().filter(age -> age > 25);//需求4:把使用Stream流操作完畢的數據收集到Set集合中并遍歷Set<Integer> ages = setStream.collect(Collectors.toSet());for (Integer age : ages) {System.out.println(age);}//定義一個字符串數組,每一個字符串數據由姓名數據和年齡數據組合而成String[] strArray = {"林青霞,30", "張曼玉,35", "王祖賢,33", "柳巖,25"};//需求5:得到字符串中年齡數據大于28的流Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);//需求6:把使用Stream流操作完畢的數據收集到Map集合中并遍歷,字符串中的姓名作鍵,年齡作值Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));Set<String> keySet = map.keySet();for (String key : keySet) {Integer value = map.get(key);System.out.println(key + "," + value);}} }

    ?

    總結

    以上是生活随笔為你收集整理的Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。