欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

30分鐘入門Java8之lambda表達(dá)式學(xué)習(xí)

 更新時(shí)間:2017年04月07日 08:56:43   作者:JohnTsai  
本篇文章主要介紹了30分鐘入門Java8之lambda表達(dá)式學(xué)習(xí),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

前言

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

  1. 默認(rèn)方法
  2. lambda表達(dá)式
  3. 多次注解

今天我們就簡(jiǎn)要學(xué)習(xí)lambda表達(dá)式。

配置開發(fā)環(huán)境

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

如果想在Android開發(fā)中使用lambda表達(dá)式,需要在Android Studio中配置Java 8開發(fā)環(huán)境。

配置app的Gradle文件:

  1. 開啟jack編譯選項(xiàng)
  2. 設(shè)置編譯選項(xiàng)兼容到1.8
android {
  defaultConfig {
    ...
    //開啟jack編譯
    jackOptions {
      enabled true
    }
  }
  ...
  //將編譯選項(xiàng)設(shè)置為Java1.8
  compileOptions {
    targetCompatibility 1.8
    sourceCompatibility 1.8
  }
}

出于種種原因,可能我們使用的JDK版本是1.7甚至更低,但是我們又想學(xué)習(xí)使用lambda表達(dá)式,怎么辦呢?Github上已經(jīng)有開發(fā)者設(shè)計(jì)了兼容lambda表達(dá)式到Java7,6,5的開源庫retrolamda。至于如何在Android Studio中配置,在此就不啰嗦了。可以參看Gradle Retrolambda Plugin。

第一個(gè)lambda表達(dá)式

看到下面的代碼,相信大家都會(huì)非常熟悉。這不就是給button設(shè)置監(jiān)聽事件嘛。

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

分析上面的代碼,這是通過匿名內(nèi)部類來設(shè)置Button的點(diǎn)擊監(jiān)聽事件的。也就是說,我們創(chuàng)建了一個(gè)實(shí)現(xiàn)了 View.OnClickListener 接口的匿名類的對(duì)象。匿名內(nèi)部類實(shí)現(xiàn)了 onClick 方法。通過這個(gè)匿名類的對(duì)象,我們?cè)谟脩酎c(diǎn)擊按鈕時(shí),打印出日志。

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

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

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

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

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

lambda表達(dá)式通常以 (argument)->(body) 這樣的格式書寫。

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

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

lambda表達(dá)式中,參數(shù)的類型可省略。Java編譯器根據(jù)表達(dá)式的上下文推導(dǎo)出參數(shù)的類型。就像上面圖中 view 的類型是 View 。

lambda表達(dá)式的結(jié)構(gòu)

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

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

//省略參數(shù)類型
 View.OnClickListener oneArgument = view->Log.d(TAG,"one argument");
 //指定參數(shù)類型
 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");
}

//返回類型是表達(dá)式主體語句的返回類型int
(int x)->x+1

lambda表達(dá)式的類型

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

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

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

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

如我們之前button的點(diǎn)擊響應(yīng)事件使用的 View.OnClickListener 就是一個(gè)函數(shù)式接口。

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

那究竟什么樣的接口是函數(shù)式接口呢?

函數(shù)式接口是只有一個(gè)抽象方法的接口。用作表示lambda表達(dá)式的類型。

Java8 API中新增了許多函數(shù)式接口:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解mybatis通過mapper接口加載映射文件

    詳解mybatis通過mapper接口加載映射文件

    本篇文章主要介紹了mybatis通過mapper接口加載映射文件 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Springboot利于第三方服務(wù)進(jìn)行ip定位獲取省份城市

    Springboot利于第三方服務(wù)進(jìn)行ip定位獲取省份城市

    本文主要介紹了Springboot利于第三方服務(wù)進(jìn)行ip定位獲取省份城市,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 關(guān)于spring.factories失效原因分析及解決

    關(guān)于spring.factories失效原因分析及解決

    這篇文章主要介紹了關(guān)于spring.factories失效原因分析及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring整合Quartz開發(fā)代碼實(shí)例

    Spring整合Quartz開發(fā)代碼實(shí)例

    這篇文章主要介紹了Spring整合Quartz開發(fā)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解springboot集成websocket的兩種實(shí)現(xiàn)方式

    詳解springboot集成websocket的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了springboot集成websocket的兩種實(shí)現(xiàn)方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • SpringCloud Ribbon負(fù)載均衡實(shí)例解析

    SpringCloud Ribbon負(fù)載均衡實(shí)例解析

    這篇文章主要介紹了SpringCloud Ribbon負(fù)載均衡實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot配置數(shù)據(jù)庫密碼加密的實(shí)現(xiàn)

    SpringBoot配置數(shù)據(jù)庫密碼加密的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot配置數(shù)據(jù)庫密碼加密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 淺談Mybatis通用Mapper使用方法

    淺談Mybatis通用Mapper使用方法

    本篇文章主要介紹了淺談Mybatis通用Mapper使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java面向?qū)ο蠡A(chǔ)詳解

    Java面向?qū)ο蠡A(chǔ)詳解

    這篇文章主要介紹了JJava面向?qū)ο蟮幕A(chǔ),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-10-10
  • mybatis整合springboot報(bào)BindingException:Invalid?bound?statement?(not?found)異常解決

    mybatis整合springboot報(bào)BindingException:Invalid?bound?stateme

    這篇文章主要給大家介紹了關(guān)于mybatis整合springboot報(bào)BindingException:Invalid?bound?statement?(not?found)異常的解決辦法,這個(gè)錯(cuò)誤通常是由于Mapper文件中的statement?id與Java代碼中的方法名不一致導(dǎo)致的,需要的朋友可以參考下
    2024-01-01

最新評(píng)論