中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

30分鐘入門Java8之lambda表達式學習

發布時間:2020-08-20 01:35:00 來源:腳本之家 閱讀:149 作者:JohnTsai 欄目:編程語言

前言

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

  1. 默認方法
  2. lambda表達式
  3. 多次注解

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

配置開發環境

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

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

配置app的Gradle文件:

  1. 開啟jack編譯選項
  2. 設置編譯選項兼容到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","按鈕被點擊,匿名內部類"); 這一行代碼,這就反映了使用匿名內部類的缺點:

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

而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表達式的結構

  1. 參數可以是零個或多個
  2. 參數類型可指定,可省略(根據表達式上下文推斷)
  3. 參數包含在圓括號中,用逗號分隔
  4. 表達式主體可以是零條或多條語句,包含在花括號中
  5. 表達式主體只有一條語句時,花括號可省略
  6. 表達式主體有一條以上語句時,表達式的返回類型與代碼塊的返回類型一致
  7. 表達式只有一條語句時,表達式的返回類型與該語句的返回類型一致
//零個
 ()-> 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

lambda表達式的類型

我們都知道,Java是一種強類型語言。所有的方法參數都有類型,那么lambda表達式是一種什么類型呢?

 View.OnClickListener listener = new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        //...
      }
    };
    
 button.setOnClickListener(listener);

如上所示,以往我們是通過使用單一方法的接口來代表一個方法并且重用它。

在lambda表達式中,仍使用的和之前一樣的形式。我們叫做函數式接口(functional interface)

如我們之前button的點擊響應事件使用的 View.OnClickListener 就是一個函數式接口。

public class View implements Drawable.Callback, KeyEvent.Callback,
    AccessibilityEventSource {
    ...
 public interface OnClickListener {
    void onClick(View v);
  }
  ...
  }

那究竟什么樣的接口是函數式接口呢?

函數式接口是只有一個抽象方法的接口。用作表示lambda表達式的類型。

Java8 API中新增了許多函數式接口:

接口名 參數 返回值 用途
Predicate T boolean 斷言
Consumer T void 消費
Function T R 函數
Supplier None T 工廠方法
UnaryOperator T T 邏輯非
BinaryOperator (T,T) T 二元操作

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

紫阳县| 黄大仙区| 万宁市| 彭阳县| 青浦区| 九江市| 开化县| 德惠市| 佛学| 始兴县| 自贡市| 呈贡县| 招远市| 新闻| 康定县| 兴安县| 金华市| 侯马市| 襄樊市| 绵阳市| 墨竹工卡县| 漳平市| 古丈县| 海口市| 玉树县| 吴旗县| 定西市| 区。| 黔江区| 肇庆市| 郸城县| 寿宁县| 容城县| 孟村| 奎屯市| 罗平县| 衡阳县| 满洲里市| 河西区| 清远市| 新巴尔虎左旗|