JavaEE_day_25_Lambda、SteamAPI
生活随笔
收集整理的這篇文章主要介紹了
JavaEE_day_25_Lambda、SteamAPI
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
1.lambd表達式
- lamada表達式函數必須保證所傳遞函數是只有一個抽象方法的接口類.
- 相當于匿名內部類(一個一次性的單一抽象方法接口類)的升級版,在箭頭函數調用lamuda表達式時,必須與抽象方法一一對應,否則調用失敗報錯
- 單句不想返回,則加{}不用加return,
- 函數式接口,給lambda表達式操作空間只留一個抽象方法,可以有其他實現的方法, (就是一個像函數的接口類)
有參的函數式接口(附三種調用方式)
無參的直接寫call(()->System.out.println(“lambda表達式”));
2.supplier
- 泛型中可以規定任意類型
- 表示供應商,所以有返回值,可以獲取數據
3.Consumer
- 表示消費者接口,所以不需要返回值
4.Function
- Function<T,R> 實現方法中傳入T類型,返回R類型
R apply(T t) 方法
5.Predicate
-
Predicate 接口 斷言接口,就是做一些判斷
-
booean test(T) 用于做校驗比較操作
6.方法引用簡寫
-
Lambda表達式的另一種表示形式,提高復用率和靈活性
-
當要傳遞給Lambda體的操作,已經有實現的方法了,可以使用方法引用!
-
方法引用可以看做是Lambda表達式深層次的表達。換句話說,方法引用就是Lambda表達式,也就是函數式接口的一個實例,通過方法的名字來指向一個方法,可以認為是Lambda表達式的一個語法糖。
-
要求:實現接口的抽象方法的參數列表和返回值類型,必須與方法引用的方法的參數列表和返回值類型保持一致!
-
格式:使用操作符“::” 將類(或對象) 與方法名分隔開來。
-
如下三種主要使用情況:
?對象::實例方法名
?類::靜態方法名
?類::實例方法名
對象::實例方法名
public static void main(String[] args) {Integer i = new Integer(123);//lambda表達式Supplier<Integer> supplier = ()->i.hashCode();System.out.println(supplier.get());//對象的引用::實例方法Supplier<Integer> supplier1 = i::hashCode;System.out.println(supplier1.get());call(()->i.hashCode());call(i::hashCode);}public static Integer call(Supplier<Integer> sup){return sup.get();}類::靜態方法名
int i = 123;//lambda表達式寫法Function<Integer,String> fun = x -> Integer.toBinaryString(i);System.out.println(fun.apply(i));//類名::靜態方法名()省略了參數,因為調用apply時還會調用Function<Integer,String> fun1 = Integer::toBinaryString;System.out.println(fun1.apply(i));類::實例方法名
//lambda表達式BiPredicate<String,String> bi = (x,y)->x.equals(y);System.out.println(bi.test("oak","ok"));//類名::實例方法BiPredicate<String,String> bi1 = String::equals;System.out.println(bi1.test("ock","ock"));7.構造方法簡寫
構造方法
//無參構造器Supplier<Student> sup11 = () -> new Student();System.out.println(sup11.get());Supplier<Student> sup12 = Student::new;System.out.println(sup12.get());//有參構造器Supplier<Student> sup21 = () -> new Student("王老菊");System.out.println(sup21.get().getName());//apply()的<參數,返回值>Function<String,Student> sup22 = Student::new;System.out.println(sup22.apply("王老菊").getName());8.數組聲明簡寫
數組聲明簡寫
// 數組引用寫法,只能動態聲明,不能靜態聲明Function<Integer, Integer[]> fun1 = Integer[]::new;Integer[] arr1 = fun1.apply(2);System.out.println(arr1.length);9.StreamAPI
- 簡言之,Stream API 提供了一種高效且易于使用的處理數據的方式。
就是用來處理集合、數組的API,集合講的是數據,而流是計算
注意:
①Stream 自己不會存儲元素。
②Stream 不會改變源對象。相反,他們會返回一個持有結果的新Stream。
③Stream 操作是延遲執行的。這意味著他們會等到需要結果的時候才執行。
9.1 創建流
// 1 通過數組 Stream.ofString[] strings = { "a", "b", "c", "d" };Stream<String> stream1 = Stream.of(strings);// 2 通過集合List<String> strings2 = Arrays.asList(strings);Stream<String> stream2 = strings2.stream();// 3 通過Stream.generate 方法來創建// 這是一個無限流,無限大,通過這種方式創建的流,在操作的時候,最好使用limit進行最大數量限制// generate的參數是 Supplier 只有一個get方法,是無參有返回值的// get方法的返回值,作為整個集合中的數據,下面這個等于都賦值為1Stream<Integer> generate = Stream.generate(() -> 1);// 可以通過limit限制最多元素個數generate.limit(5).forEach(x -> System.out.println(x));// 4 通過Stream.iterate 方法來創建// 這是一個無限流,無限大,通過這種方式創建的流,在操作的時候,最好使用limit進行最大數量限制// 第一個參數是起始值,第二個參數是UnaryOperator 繼承了Function 所以 有參有返回值// 1 就是起始值, x+2 就是步長,類似于一個死循環,起始值是1,步長 是2,終止條件是trueStream<Integer> iterate = Stream.iterate(1, x->x+2);iterate.limit(5).forEach(x->System.out.println(x));// 5 已有類的Stream源生成APIString str = "abc";IntStream chars = str.chars();chars.forEach(x->System.out.println(x));9.2 流的中間操作(轉換算子)
stream.(轉換算子).(動作算子)
- filter : 對元素進行過濾,不符合條件的,就不要了
- distinct : 去掉重復
- skip : 跳過多少個元素
- limit : 取一個集合中的前幾條數據
- map : 可以理解為是在遍歷集合的過程中,對元素進行操作. 比如進行判斷,集合元素是否大于4 ,返回值為boolean類型,或者對集合元素進行更改,比如每個元素都自身+1
- flatMap : 解決一個字符串數組,返回單一的字符串使用flatMap
9.3 流的終止操作(動作算子)
stream.(轉換算子).(動作算子)
- forEach : 循環
- 計算 : min,max,count,average
- 匹配 :anyMatch,allMatch,noneMatch,findFirst,findAny
- 匯聚 : reduce
- 收集器 : collect
總結
以上是生活随笔為你收集整理的JavaEE_day_25_Lambda、SteamAPI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [编程题] 涂棋盘
- 下一篇: 应用在夜灯领域的环境光测距感器芯片