国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java Lambda表達式的使用心得

java Lambda表達式的使用心得

2022-02-15 16:02知我飯否 Java教程

這篇文章主要介紹了java Lambda表達式的使用心得,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Lambda表達式的心得

如題,因為博主也是最近才接觸到Lambda表達式的(PS 在這里汗顏一會)。我并不會講解它的原理,誠然任何一件事物如果理解原理的話,使用它必將更加容易。但博主在學習的時候,大多數時候都是學會怎么用,然后在細究原理。就像你騎自行車之前,難道首先還要研究自行車的原理么?

首先Lambda表達式的最簡單應用如下

Lambda表達式法

      String lam= "初次相識Lambda";
      new Thread(() -> System.out.println(lam)).start();

傳統方法

String tradition="傳統方法";
      new Thread(new Runnable() {
          @Override
          public void run() {
              System.out.println(tradition);
          }
      }).start();

輸出結果

java Lambda表達式的使用心得

很簡潔有沒有?省略了好多代碼是不是,在這里 你可以發現”,Lambda表達式和在Thread創建一個匿名類的作用是一樣。我們可以這樣認為Lambda表達式本身代表了一個匿名類。

這就是Lambda最大的作用,當然Lambda表達式只能創建接口interface對象。 創建類是不行的,抽象類也是不行的 ,只要是類都是不行的。

首先,我定義了一個自定義的接口,可以用來測試

@FunctionalInterface
public interface Lam {
  //Lambda表達式調用的方法
  void bda();
  
  //接口的默認方法
  default void test(){
      System.out.println("我是默認的方法");
  };
  //接口的靜態方法
  static void test1(){
      System.out.println("我是靜態方法");
  }
}

使用Lambda表達式 你首先要知道的

1.Lambda表達式只能是接口 interface的創建(PS從上面的例子可以看出來,Runnable是接口,可以查看源代碼),并且這個接口只能包含一個方法(除了default方法和static方法)。在接口中創建default方法和static方法都必須要實現方法體如下圖

java Lambda表達式的使用心得

2.如果你用Lambda表達式來創建類 class,則會出現以下錯誤 ”Target type of a lambda conversion must be an interface“如果你怕自己的定義的接口不符合Lambda表達式的規范 ,你可以在接口interfaca 上面添加注解@FunctionalInterface

3.Lambda表達式的規范表示格式 (parameters) ->{ statements; }。在某些時刻,你還可以簡化這個格式

//接口定義的方法無參數時候,并且你想要執行操作也只有一句代碼的時候,Lambda會自動返回一句代碼,并且可以不用加{}
      Lam lam1=()->System.out.println("無參數");

你可以發現后面的大括號{ }沒了,這是因為后面代碼如果只有一句的話,是可以省略{ } 的

我們把Lam接口定義的調用方法參數修改一下,多出了一個String類型的形參s

//Lambda表達式調用的方法
  void bda(String s);

這時候 我們如果使用Lambda表達式,則可以這樣

//接口定義的方法有參數時候,并且你想要執行的操作也只有一句代碼的時候
      Lam lam1=e->System.out.println(e);//這一句還有簡化版本  Lam lam1=System.out::println;
      lam1.bda("4556");

你又會發現,前面的()中括號也沒了,這是因為當參數只有一個的時候,是可以省略()的。

當然也有你要執行很多代碼的時候,那這時候可以這樣

//接口定義的方法有參數時候,并且你想要執行的操作有很多句代碼的時候
      Lam lam1 = (String e) -> {
          String a = e + "add";
          System.out.println(a);
      };
      lam1.bda("test+");

輸出結果如下

java Lambda表達式的使用心得

當然你還會問Lambda表達式能不能返回東西呢?這是肯定能的,首先我們再把上面的Lam接口方法修改一下

//Lambda表達式調用的方法
  String bda(String s);

讓bda方法返回一個String值,這次如果我們用Lambda的話

//接口定義的方法有返回值的時候
      Lam lam1=s ->{System.out.println(s);return "我是返回的數據";};
      lam1.bda("test1");
      System.out.println(lam1.bda("test2"));

運行的結果:

java Lambda表達式的使用心得

總結 Lambda表達式 就是用來創建一個匿名的接口對象,即 它本身就是一個接口的匿名實例。只不過這個接口 有一些條件限制。

 

Lambda表達式的技巧

Lambda表達式只能用來簡化僅包含一個public方法的接口的創建

規則

  • 1.只能是接口
    • 否則報:Target type of a lambda conversion must be an interface
  • 2.只能有一個public方法
    • 否則報:Multiple non-overriding abstract methods found AInterface
    • 或AInterface is not a functional interface

括號形式

testA((int i, int j) -> {});參數要與接口一致

public class Go {
  public static void main(String a[]) {
      //正確示范
      testA((int i, int j) -> {});
      //錯誤示范:Multiple non-overriding abstract methods found xxx;只能有一個public方法
      testB((int i, int j) -> {});
      //錯誤示范:Target type of a lambda conversion must be an interface;只能是接口
      testC((int i, int j) -> {});
  }
  public static void testA(AInterface t) {    }
  public static void testC(CInterface t) {}
  public static void testB(BInterface t) {}
  interface AInterface {
      void xxx(int i, int j);
  }
  interface BInterface {
      void xxx(int i, int j);
      void YYY(int i, int j);
  }
  abstract class CInterface {
      abstract void xxx(int i, int j);
  }
}

雙冒號表達形式

  • 雙冒號后面必須是靜態方法
    • 否則報錯:Non-static method cannot be referenced from a static context
  • 雙冒號后面的方法與接口方法參數一樣
  • 方法與接口的權限可以不一樣
  • 返回類型:如果接口里面方法是void,雙冒號后的方法可以任意返回類型,否則要一致
public class Go {
  public static void main(String a[]) {
      //之前的寫法
      testA(new AInterface() {
          @Override
          public void xxx(int i, int j) {
              
          }
      });
      //正確,相對與接口里面xxx方這是改成靜態和換了個名字
      testA(Go::mydog);
      //正確,加了返回類型和public換成private,也是ok
      testA(Go::mydog2);
      
      //錯誤:Non-static method cannot be referenced from a static context
      testA(Go::mydog3);
      //這樣寫也是ok的。
      AInterface aInterface = Go::mydog;
      testA(aInterface);
  }
  public static void testA(AInterface t) {
      t.xxx(1, 2);
  }
  interface AInterface {
      void xxx(int i, int j);
  }
  public static boolean mydog(int i, int j) {
      System.out.println("mydog" + i + " & " + j);
      return false;
  }
  private static void mydog2(int i, int j) {
      System.out.println("mydo2" + i + " & " + j);
  }
  public void mydog3(int i, int j) {
      System.out.println("mydog3" + i + " & " + j);
  }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/a1064072510/article/details/80947286

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩高清一区 | 国产啊v在线观看 | 日韩国伦理久久一区 | 成人午夜激情 | 免费黄色小视频 | 欧美一区二区三区在线播放 | 久久久久久亚洲一区二区三区蜜臀 | 99久久婷婷国产综合精品电影 | 欧美在线国产 | 亚洲精品国产剧情久久9191 | 国产成人一区二区三区 | 国产在线视频一区二区 | 亚洲日韩中文字幕一区 | 俺去俺来也www色官网cms | 亚洲精品视频免费在线观看 | 久久久精品亚洲 | 欧美一区二区三区在线观看视频 | 国产一区二区三区欧美 | 精品国产三级 | 欧美日本在线 | 仙人掌旅馆在线观看 | 欧美日韩久| 久久国产精品99国产精 | 一区二区免费在线观看 | 欧美天天 | 视频一区 日韩 | 中文日韩在线 | 高清在线一区 | 成人av视屏| 亚洲蜜桃精久久久久久久 | 成人黄色免费在线视频 | 欧美日韩国产在线 | 亚洲免费视频在线观看 | 欧美二区三区 | 中国一级黄色片子 | 国产欧美精品区一区二区三区 | 久久久99精品免费观看 | 色.com | 国产精品成人一区二区三区夜夜夜 | 中文字幕在线看 | 久久亚洲欧美日韩精品专区 |