最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8的Lambda表達式你真的會嗎

 更新時間:2021年01月04日 08:54:30   作者:天喬巴夏丶  
這篇文章主要介紹了Java8的Lambda表達式你真的會嗎,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

理解Lambda

Lambda表達式可以是一段可以傳遞的代碼,它的核心思想是將面向對象中的傳遞數(shù)據(jù)變成傳遞行為,也就是行為參數(shù)化,將不同的行為作為參數(shù)傳入方法。

隨著函數(shù)式編程思想的引進,Lambda表達式讓可以用更加簡潔流暢的代碼來代替之前冗余的Java代碼。

口說無憑,直接上個例子吧。在Java8之前,關于線程代碼是這樣的:

class Task implements Runnable{

 @Override
 public void run() {
  System.out.println("Java8 之前 實現(xiàn)Runnable接口中的run方法");
 }
}
Runnable t = new Task();

我們定義了一個Task類,讓它實現(xiàn)Runnable接口,實現(xiàn)僅有的run方法,我們希望執(zhí)行的線程體雖然只有一句話,但我們仍然花了大量大代碼去定義。為了簡化,我們可以采用匿名內部類的方式:

Runnable taskBeforeJava8 = new Runnable() {
 @Override
 public void run() {
  System.out.println("Java8 之前的寫法, 傳入匿名類");
 }
};

但是,其實還是不夠簡潔,我們用Lambda的寫法是這樣的:

// java8 之后
Runnable taskAfterJava8 = () -> System.out.println("Java8 之后的寫法,lambda表達式");

我們僅僅使用()->就完成了這件事,是不是非常簡潔呢?如果你覺得雖然Lambda寫法簡潔,但是它的規(guī)則讓人摸不著頭腦,那就跟著我接下去學叭。

基礎語法

(parameters) -> action
 (parameters) -> expression
 (parameters) -> {statements;}

parameters代表變量,可以為空,可以為單,可以為空,你能想到的方式他都可以。

action是實現(xiàn)的代碼邏輯部分,可以是一行代碼expression,也可以是一個代碼片段statements。如果是代碼片段,需要加上{}。

下面是一些合法的示例,你可以看看有沒有掌握:

表達式 描述
() -> 1024 不需要參數(shù),返回值為1024
x -> 2 * x 接收參數(shù)x,返回其兩倍
(x, y) -> x - y 接收兩個參數(shù),返回它們的差
(int x, int y) -> x + y 接收兩個int類型參數(shù),返回他們的和
(String s) -> print(s) 接收一個String對象,并打印

函數(shù)式接口

@FunctionalInterface // 此注解作用的接口 只能擁有一個抽象方法
public interface Runnable {
 public abstract void run();
}

在這里,@FunctionalInterface注解是非必須的,有點類似于@Override,起強調作用,如果你的接口標注該注解,卻沒有遵循它的原則,編譯器會提示你修改。

常用的函數(shù)式接口

JDK原生為我們提供了一些常用的函數(shù)式編程接口,讓我們在使用他們編程時,不必關心接口名,方法名,參數(shù)名,只需關注它的參數(shù)類型,參數(shù)個數(shù),返回值。

接口 參數(shù) 返回值 類別 示例
Consumer T void 消費型接口 打印輸出某個值
Supplier None T 供給型接口 工廠方法獲取一個對象
Function T R 函數(shù)型接口 獲取傳入列表的總和
Predicate T boolean 斷言型接口 判斷是否以summer為前綴

消費型接口

@FunctionalInterface // 此注解作用的接口 只能擁有一個抽象方法
public interface Runnable {
 public abstract void run();
}

供給型接口

/**
  * 供給型接口, 無參數(shù),返回T
  */
 public static void supplierTest() {
  Supplier<Object> supplier = () -> new Object();
  System.out.println(supplier.get());
 }

斷言型接口

 /**
  * 斷言型 傳入?yún)?shù)T ,返回boolean
  */
 public static void predicateTest() {
  Predicate<String> predicate = name -> name.startsWith("summer");
  System.out.println(predicate.test("summerday"));
 }

函數(shù)型接口

 /**
  * 函數(shù)型接口 傳入T 返回R
  */
 public static void functionTest() {
  List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
  Function<List<Integer>, Integer> function = num -> {
   int res = 0;
   for (int n : list) {
    res += n;
   }
   return res;
  };
  Integer num = function.apply(list);
  System.out.println(num);
 }

方法引用

方法引用可以看作特定Lambda表達式的快捷寫法,主要分為以下兩種:

  • 指向靜態(tài)方法的方法引用
  • 指向現(xiàn)有對象的實例方法的方法引用
/**
 * 方法引用
 * 1. 指向靜態(tài)方法的方法引用
 * 2. 指向現(xiàn)有對象的實例方法的方法引用
 *
 * @author Summerday
 */
public class MethodReferenceTest {
	
 public static List<String> getList(List<String> params, Predicate<String> filter) {
  List<String> res = new LinkedList<>();
  for (String param : params) {
   if (filter.test(param)) {
    res.add(param);
   }
  }
  return res;
 }
 // 靜態(tài)方法
 public static boolean isStartWith(String name) {
  return name.startsWith("sum");
 }

 public static void main(String[] args) {
  List<String> params = Arrays.asList("summerday","tqbx","天喬巴夏","summer","");
  //靜態(tài)方法的方法引用 getList(params, name -> MethodReferenceTest.isStartWith(name));
  List<String> list = getList(params, MethodReferenceTest::isStartWith);
  System.out.println(list);
  
  // 指向現(xiàn)有對象的實例方法的方法引用 getList(params, name -> name.isEmpty());
  List<String> sum = getList(params, String::isEmpty);
  System.out.println(sum);
  
 }
}

數(shù)組引用

/**
 * 數(shù)組引用
 * @author Summerday
 */
public class ArrayReferenceTest {

 public static void main(String[] args) {
  // 普通lambda
  Function<Integer,String[]> fun1 = x -> new String[x];
  String[] res1 = fun1.apply(10);
  System.out.println(res1.length);

  // 數(shù)組引用寫法
  Function<Integer,String[]> fun2 = String[]::new;
  String[] res2 = fun2.apply(10);
  System.out.println(res2.length);

 }
}

構造器引用

/**
 * 構造器引用
 * @author Summerday
 */
public class ConstructorReferenceTest {

 public static void main(String[] args) {

  // 普通lambda
  Supplier<User> sup = () -> new User();

  // 構造器引用
  Supplier<User> supplier = User::new;
  User user = supplier.get();
  System.out.println(user);
 }

}

class User{

}

總結

  •  lambda表達式沒有名稱,但有參數(shù)列表,函數(shù)主體,返回類型,可能還有一個可以拋出的異常的列表。
  • lamda表達式讓你可以將不同的行為作為參數(shù)傳入方法。
  • 函數(shù)式接口是僅僅聲明了一個抽象方法的接口。只有在接受函數(shù)式接口的地方才可以使用lambda表達式。
  • lambda表達式允許你直接內聯(lián),為函數(shù)式接口的抽象方法提供實現(xiàn),并將整個表達式作為函數(shù)式接口的一個實例。
  • Java8自帶了一些常用的函數(shù)式接口,包括Predicate,Function,Supplier,Consumer,BinaryOperator。
  • 方法引用讓你重復使用現(xiàn)有的方法實現(xiàn)并直接傳遞他們:Classname::method。

到此這篇關于Java8的Lambda表達式你真的會嗎的文章就介紹到這了,更多相關Java8的Lambda表達式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在idea中創(chuàng)建SpringBoot項目

    在idea中創(chuàng)建SpringBoot項目

    這篇文章主要介紹了在idea中創(chuàng)建SpringBoot項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Spring Security自定義異常 AccessDeniedHandler不生效解決方法

    Spring Security自定義異常 AccessDeniedHandler不生效解決方法

    本文主要介紹了Spring Security自定義異常 AccessDeniedHandler不生效解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 使用JDBC4.0操作XML類型的字段(保存獲取xml數(shù)據(jù))的方法

    使用JDBC4.0操作XML類型的字段(保存獲取xml數(shù)據(jù))的方法

    jdbc4.0最重要的特征是支持xml數(shù)據(jù)類型,接下來通過本文重點給大家介紹如何使用jdbc4.0操作xml類型的字段,對jdbc4.0 xml相關知識感興趣的朋友一起看下吧
    2016-08-08
  • 聊一聊new對象與Spring對bean的初始化的差別

    聊一聊new對象與Spring對bean的初始化的差別

    這篇文章主要介紹了聊一聊new對象與Spring對bean的初始化的差別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java內存模型中的虛擬機棧原理分析

    Java內存模型中的虛擬機棧原理分析

    這篇文章主要介紹了Java內存模型中的虛擬機棧原理分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 淺談Java的WeakHashMap源碼

    淺談Java的WeakHashMap源碼

    這篇文章主要介紹了淺談Java的WeakHashMap源碼,WeakHashMap,從名字可以看出它是某種?Map,它的特殊之處在于?WeakHashMap?里的entry可能會被GC自動刪除,即使程序員沒有調用remove()或者clear()方法,需要的朋友可以參考下
    2023-09-09
  • Java集合之整體結構

    Java集合之整體結構

    Java中集合類是Java編程中使用最頻繁、最方便的類。接下來通過本文給大家介紹Java集合之整體結構,一起看看吧
    2016-05-05
  • spring mvc @PathVariable綁定URI模板變量值方式

    spring mvc @PathVariable綁定URI模板變量值方式

    這篇文章主要介紹了spring mvc @PathVariable綁定URI模板變量值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 歸并排序的實現(xiàn)代碼與思路

    歸并排序的實現(xiàn)代碼與思路

    歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。
    2013-03-03
  • java轉化為exe程序步驟詳解

    java轉化為exe程序步驟詳解

    在本篇內容里我們給大家分享了關于java轉化為exe程序的具體步驟和相關知識點,需要的朋友們學習下。
    2019-03-03

最新評論

永仁县| 民权县| 梁河县| 阜阳市| 霍州市| 崇礼县| 云南省| 罗平县| 公安县| 霸州市| 额济纳旗| 郸城县| 莆田市| 涞水县| 方正县| 德安县| 台安县| 德令哈市| 玛多县| 治县。| 太原市| 奎屯市| 林口县| 通海县| 澎湖县| 普宁市| 张北县| 松江区| 丹巴县| 交城县| 饶河县| 保康县| 宁南县| 大同县| 新巴尔虎左旗| 平果县| 晋中市| 乌拉特后旗| 娱乐| 法库县| 合阳县|