程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 30分鐘入門Java8之lambda表達式

30分鐘入門Java8之lambda表達式

編輯:JAVA編程入門知識

前言

Google在今年發布Android N開發者預覽版,一並宣布開始支持Java 8。我們終於能在Android開發中使用到Java8的一些語言特性了。目前支持:

  • 默認方法
  • lambda表達式
  • 多次注解

今天我們就簡要學習lambda表達式。

配置開發環境

首先需要下載安裝JDK1.8。

如果想在Android開發中使用lambda表達式,需要在Android Studio中配置Java 8開發環境。

配置app的Gradle文件:

  • 開啟jack編譯選項
  • 設置編譯選項兼容到1.8
android {
    defaultConfig {
        ...
        //開啟jack編譯
        jackOptions {
            enabled true
        }
    }
   ...
   //將編譯選項設置為Java1.8
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

出於種種原因,可能我們使用的JDK版本是1.7甚至更低,但是我們又想學習使用lambda表達式,怎麼辦呢?Github上已經有開發者設計了兼容lambda表達式到Java7,6,5的開源庫retrolamda。至於如何在Android Studio中配置,在此就不啰嗦了。可以參看Gradle Retrolambda Plugin。

第一個lambda表達式

看到下面的代碼,相信大家都會非常熟悉。這不就是給button設置監聽事件嘛。

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("TAG","按鈕被點擊,匿名內部類");
            }
        });

分析上面的代碼,這是通過匿名內部類來設置Button的點擊監聽事件的。也就是說,我們創建了一個實現了View.OnClickListener接口的匿名類的對象。匿名內部類實現了onClick方法。通過這個匿名類的對象,我們在用戶點擊按鈕時,打印出日志。

可是,大家有沒有發現。上面那段代碼,真正有用的就是Log.d("TAG","按鈕被點擊,匿名內部類");這一行代碼,這就反映了使用匿名內部類的缺點:

  • 可讀性差,不能直接明了的體現我們的意圖。
  • 啰嗦,一行邏輯代碼卻有幾行模板代碼。

而lambda表達式很好的解決了這些問題:

button.setOnClickListener(view-> Log.d(TAG,"按鈕被點擊,lambda表達式"));

view-> Log.d(TAG,"按鈕被點擊,lambda表達式"));就是我們寫的第一個lambda表達式。

由上圖可知,lambda表達式通常以(argument)->(body)這樣的格式書寫。

//省略參數類型
(arg1,arg2...) -> {body}

//指定參數類型
(Type1 arg1,Type2 arg2...)->{body}

lambda表達式中,參數的類型可省略。Java編譯器根據表達式的上下文推導出參數的類型。就像上面圖中view的類型是View

lambda表達式的結構

  • 參數可以是零個或多個
  • 參數類型可指定,可省略(根據表達式上下文推斷)
  • 參數包含在圓括號中,用逗號分隔
  • 表達式主體可以是零條或多條語句,包含在花括號中
  • 表達式主體只有一條語句時,花括號可省略
  • 表達式主體有一條以上語句時,表達式的返回類型與代碼塊的返回類型一致
  • 表達式只有一條語句時,表達式的返回類型與該語句的返回類型一致
//零個
 ()-> System.out.println("no argument");
 
//一個
  x->x+1

//兩個
  (x,y)->x+y

//省略參數類型
 View.OnClickListener oneArgument = view->Log.d(TAG,"one argument");
 //指定參數類型
 View.OnClickListener oneArgument = (View view)->Log.d(TAG,"one argument");

//多行語句
//返回類型是代碼塊返回的void
View.OnClickListener multiLine = (View view)->{
      Log.d(TAG,"multi statements");
      Log.d(TAG,"second line");
}

//返回類型是表達式主體語句的返回類型int
(int x)->x+1
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved