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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java8中的lambda表达式实用详解

發布時間:2024/3/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java8中的lambda表达式实用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java8中的lambda表達式實用詳解

1. lambda簡介

? Lambda 表達式(lambda expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式可以表示閉包(注意和數學傳統意義上的不同)。Lambda表達式是Java8中的新特性,編碼一般是盡可能輕量級的將代碼封裝為數據,傳統的解決方案是通過接口和實現類(匿名內部類)實現,這種方式存在語法冗余,this關鍵字,變量捕捉,數據控制等問題lambda概述

2. lambda特點

  • Lambda表達式理解為一段可以傳遞的代碼,可以寫出更簡潔、更靈活的代碼。

  • 使代碼更簡潔,緊湊

  • 可以使用并行流來并行處理,充分利用多核CPU的優勢,有利于JIT編譯器對代碼進行優化

3. lambda經典案列

  • 線程創建的兩種方式:繼承Thread方式、實現Runnable方式
public interface Runnable{void run(); }
  • 匿名內部方式創建一個線程

Tread類傳遞了一個匿名的Runnable對象,重載Runnable接口的run()方法來實現相應邏輯。

public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Override //重寫Runnable接口里面的run()方法public void run() {System.out.println("匿名內部類方式--線程1");}});thread.start(); //啟動線程 }
  • Lambda表達式創建一個線程
public static void main(String[] args) {Thread thread = new Thread(() -> System.out.println("匿名內部類方式-啟動線程2"));thread.start(); }

4.lambda語法格式

4.1 Lambda表達式的標準語法格式

Lambda表達式就是對函數式接口中抽象方法的實現,是對其匿名內部類的一個簡寫,只保留了方法的參數列表和方法體,其他的成分可以省略。因此,Lambda表達式的格式非常簡潔,只有三部分組成:

  • 參數:指定了Lambda表達式需要的所有參數,如果有多個參數,參數之間用逗號隔開;如果沒有參數,留空即可
  • 箭頭:由英文中畫線和大于符號組成,固定寫法。代表指向動作
  • 方法體:Lambda表達式要執行的功能,具體的代碼方法內容
(參數,,參數)->{方法體}基本語法:(parameters) -> expression 或 (parameters) ->{ statements; }

注:

  • 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
  • 可選的參數圓括號:一個參數無需定義圓括號,但無參數或多個參數需要定義圓括號。
  • 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
  • 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。

4.2 Lambda表達式省略語法格式

在Lambda標準語法格式的基礎上,可以使用省略寫法的規則:

  • 若小括號內參數只有一個可以省略。
  • 若小括號內沒有參數或有兩個及以上的參數,則 小括號不能省略。
  • 若大括號內只有一條語句,無論是否有返回值,大括號、return關鍵字、分號可以省略。
案例一:無參,無返回值,只有一條語句 public static void main(String[] args) {Runnable runnable = () -> System.out.println("lambda 運行1");runnable.run();}//結果 lambda 運行1 案例二:一個參數,無返回值 public static void main(String[] args) {Consumer<String> consumer = (x) -> System.out.println(x);//可簡化 Consumer<String> consumer = System.out::println;consumer.accept("lambda 運行2");}//結果 lambda 運行2 案例三:一個參數時,參數的小括號可以省略 public static void main(String[] args) {Consumer<String> consumer3 = x -> System.out.println(x);//可簡化 Consumer<String> consumer3 = System.out::println;consumer3.accept("lambda 運行3");}//結果 lambda 運行3 案例四:有兩個參數,并且Lambda體中有多條語句。 public static void main(String[] args) {Comparator<Integer> com4 = (x, y) -> {System.out.println("lambda 運行4");return Integer.compare(x, y);};System.out.println(com4.compare(1, 2));}//結果 lambda 運行4 -1 案例五:有兩個以上參數,有返回值,若Lambda體中只有一條語句,return和大括號都可以省略不寫 public static void main(String[] args) {Comparator<Integer> com5 = (x, y) -> Integer.compare(x, y);//可簡化 Comparator<Integer> com5 = Integer::compare;System.out.println(com5.compare(1, 2));}//結果 -1 案例六:Lambda表達式的參數列表的數據類型可以省略不寫,因為JVM可以通過上下文推斷出數據類型,即“類型推斷” public static void main(String[] args) {Comparator<Integer> com = (Integer x, Integer y) -> Integer.compare(x, y);//可簡化 Comparator<Integer> com = Integer::compare;System.out.println(com.compare(1, 2));}//結果 -1

**口訣:**左右遇一括號省,左側推斷類型省,能省則省。

5. 方法引用

方法引用的三種形式

  • 類 :: 靜態方法

  • 類 :: 非靜態方法

  • 對象 :: 非靜態方法

注:

方法引用規定,對象不能調用靜態方法,這和面向對象的思想一致。但類可以調用非靜態方法,這是面向對象中不允許的。

5.1 類引用靜態方法

語法格式:類::靜態方法名

public static void main(String[] args) {Comparator<Integer> comparable= Integer::compare;//使用方法引用實現相同效果Comparator<Integer> integerComparable=Integer::compare;System.out.println(integerComparable.compare(2,1));System.out.println(comparable.compare(2,1)); }//結果 1 1
5.2 類引用普通方法

語法格式:類::實例方法名

public static void main(String[] args) {BiPredicate<String, String> biPredicate = String::equals;//使用方法引用實現相同效果BiPredicate<String, String> bp2 = String::equals;System.out.println(biPredicate.test("1", "2"));System.out.println(biPredicate.test("1", "2")); }//結果 false false
5.3 對象引用非靜態方法

語法格式: 實例化對象::普通方法;

public static void main(String[] args) {Consumer<String> consumer = System.out::println;consumer.accept("java"); }//結果 java

6. 構造引用

構造引用語法格式: 類名稱::new

  • 和方法引用類似,函數式接口的抽象方法的形參列表和構造器的形參列表一致。

  • 抽象方法的返回值類型即為構造器所屬的類的類型

//data: public static class Employee {private Integer id;private String name;private Integer age;@Overridepublic String toString() {return "Employee{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}public Employee(){}public Employee(Integer id) {this.id = id;}public Employee(Integer id, Integer age) {this.id = id;this.age = age;}public Employee(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}}

實例:

public static void main(String[] args) {//原始寫法Supplier<Employee> sup = new Supplier<Employee>() {@Overridepublic Employee get() {return new Employee();}};// Lambda寫法Supplier<Employee> sup1 = () -> new Employee();//構造器引用寫法//Supplier中的T get()//Employee的空參構造器:Employee()Supplier<Employee> sup2 = Employee :: new;} // Lambda寫法 Function<Integer,Employee> func1 = id -> new Employee(id);//構造器引用寫法 //Function中的R apply(T t) Function<Integer,Employee> func2 = Employee :: new; // Lambda寫法 BiFunction<Integer,String,Employee> func1 = (id,name) -> new Employee(id,name);//構造器引用寫法 //BiFunction中的R apply(T t,U u) BiFunction<Integer,String,Employee> func2 = Employee :: new;

7. 數組引用

數組引用的格式:type[]:new

public static void main(String[] args) {Function<Integer,String[]> function=String[]::new;String[] apply = function.apply(5);System.out.println(apply.length); }//結果 5

8. Lambda表達式的作用域

? Lambda表達式可以看作是匿名內部類實例化的對象,Lambda表達式對變量的訪問限制和匿名內部類一樣,因此Lambda表達式可以訪問局部變量、局部引用,靜態變量,實例變量。

8.1 訪問局部變量

可以直接在 lambda 表達式中訪問外部的局部變量

public static void main(String[] args) { final int num = 1; //不用聲明為final 也可以 //int num = 1; Converter<Integer, String> stringConverter =(from) -> String.valueOf(from + num);stringConverter.convert(2); }//結果 3
8.2 訪問對象字段,靜態變量

和局部變量不同的是,Lambda內部對于實例的字段(即:成員變量)以及靜態變量是既可讀又可寫。

import org.springframework.core.convert.converter.Converter;public static void main(String[] args) {Lambda4 lambda4 = new Lambda4();lambda4.testScopes(); }class LambdaTest {static int myStaticNum;int myNum;void testScopes() {Converter<Integer, String> stringConverter1 = (from) -> {outerNum = 23;return String.valueOf(from);};String convert = stringConverter1.convert(1);System.out.println("Integer轉化String結果" + convert);Converter<Integer, String> stringConverter2 = (from) -> {outerStaticNum = 72;return String.valueOf(from);};String convert2 = stringConverter2.convert(2);System.out.println("Integer轉化String結果" + convert2);} }//結果 Integer轉化String結果 1 Integer轉化String結果 2

9. 總結

? java8新特性之lambda表達式知識總結的文章就介紹到這了,這邊列舉了部分例子供參考,僅作為學習筆記使用,歡迎批評指正,要是感興趣可以關注微信訂閱號 程序own

總結

以上是生活随笔為你收集整理的java8中的lambda表达式实用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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