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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lambda 详解

發(fā)布時間:2024/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lambda 详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Lambda 表達式支持將代碼塊作為方法參數(shù)
允許使用更簡潔的創(chuàng)建只有一個抽象方法的接口(函數(shù)式接口)的實例

來源

lambda 也叫 匿名函數(shù)
是從 函數(shù)式編程 語言借鑒而來,用于編寫清晰,高效的代碼

有點像匿名內(nèi)部類的升級版
相比起來更為簡潔。
兩者區(qū)別在于匿名內(nèi)部類會創(chuàng)建 class 文件,lambda 只能用于單個抽象方法的接口

java8 的 lambda 引入了兩個核心思想

  • 方法引用
  • 行為參數(shù)化 把一個方法作為參數(shù)傳遞給另一個方法

入門demon

定義一個處理數(shù)組的類,

/*** 處理數(shù)組的類* 這個處理的行為是不確定的*/ public class ProcessArray {/*** 只有在調(diào)用 process 方法時才知道處理數(shù)組的行為*/public void process(int[] target, Command command){command.process(target);}}

由于這個行為不固定 我們需要一個 command 接口

/*** 命令接口*/ public interface Command {void process(int[] target);}

我們使用 ProcessArray 這個類需要傳入 command 實例, 正常而言會采用匿名內(nèi)部類的方式

/*** 正常采用匿名內(nèi)部類的方式調(diào)用*/ @Test public void t1(){int[] a = {1,2,3,4};ProcessArray processArray = new ProcessArray();//調(diào)用 process 方法才知道要求和processArray.process(a, new Command() {@Overridepublic void process(int[] target) {int sum = 0;for (int i : a) {sum += i;}log.info("數(shù)組和為{}", sum);}}); }

lambda 出來后,可以簡化一點

/*** 通過 lambda 表達式優(yōu)化代碼*/ @Test public void t2(){int[] a = {1,2,3,4};ProcessArray processArray = new ProcessArray();processArray.process(a, target -> {int sum = 0;for (int i : target) {sum += i;}log.info("數(shù)組和為{}", sum);}); }

以上是 lambda 最簡單的應(yīng)用方式

使用方式

lambda 表達式允許把函數(shù)作為一個方法的參數(shù)進行傳遞

  • **可選類型聲明:**不需要聲明參數(shù)類型,編譯器可以統(tǒng)一識別參數(shù)值。
  • **可選的參數(shù)圓括號:**一個參數(shù)無需定義圓括號,但多個參數(shù)需要定義圓括號。
  • **可選的大括號:**如果主體包含了一個語句,就不需要使用大括號。
  • **可選的返回關(guān)鍵字:**如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定表達式返回了一個數(shù)值。
public class lambdaDemon {public static boolean salutation;interface MathOperation{int operation(int x,int y);};int operate(int x, int y,MathOperation mathOperation){return mathOperation.operation(x,y);}@Testpublic void t1(){lambdaDemon lambdaDemon = new lambdaDemon();MathOperation add = Integer::sum;MathOperation division = (x, y) -> x/y;System.out.println("10 + 5 = " + lambdaDemon.operate(10, 5, add));System.out.println("10 / 5 = " + lambdaDemon.operate(10, 5, division));} }

構(gòu)造器引用

格式為 ClassName :: new

用處不大 用于調(diào)用構(gòu)造器創(chuàng)建對象
構(gòu)造器的參數(shù)列表 由接口的參數(shù)決定
比如 Supplier 接口調(diào)用無參構(gòu)造器 Function 方法可以調(diào)用一個參數(shù)的構(gòu)造器

Supplier<String> supply = String::new; System.out.println(supply.get());Function<String, String> fun = String::new; System.out.println(fun.apply("哈哈哈"));

方法引用

是一種語法糖
當 lambda 體中的內(nèi)容已經(jīng)有方法實現(xiàn)了,我們可以用方法引用去簡化代碼
一共有三種語法格式

  • 對象 :: 實例方法名
  • 類 :: 靜態(tài)方法名
  • 類 :: 實例方法名

對象 :: 實例方法名

/*** 對象 :: 實例方法名*/@Testpublic void t1(){//lambda 寫法Consumer<String> con1 = s -> System.out.println(s);//方法引用Consumer<String> con2 = System.out::println;}

類 :: 靜態(tài)方法名

@Testpublic void t2(){//lambda 寫法Comparator<Integer> comparator1 = (x, y)->Integer.compare(x, y);System.out.println(comparator1.compare(1, 2));//方法引用 ** 需要注意被調(diào)用方法的參數(shù)列表和返回值類型需要和函數(shù)式接口中保持一致 **Comparator<Integer> comparator2 = Integer::compare;}

類 :: 實例方法名

@Testpublic void t3(){//lambda 寫法BiPredicate<String, String> biPredicate1 = (x, y) -> x.equals(y);//方法引用 ** 第一個參數(shù)是這個實例方法的調(diào)用者 第二個參數(shù)是這個方法的參數(shù)時 可以使用這種語法 **BiPredicate<String, String> biPredicate2 = String::equals;}

總結(jié)

以上是生活随笔為你收集整理的Lambda 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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