一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - 30分鐘入門Java8之lambda表達式學(xué)習(xí)

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

2020-09-07 09:17JohnTsai Java教程

本篇文章主要介紹了30分鐘入門Java8之lambda表達式學(xué)習(xí),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

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

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

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

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

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

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

配置app的Gradle文件:

  1. 開啟jack編譯選項
  2. 設(shè)置編譯選項兼容到1.8
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
  defaultConfig {
    ...
    //開啟jack編譯
    jackOptions {
      enabled true
    }
  }
  ...
  //將編譯選項設(shè)置為Java1.8
  compileOptions {
    targetCompatibility 1.8
    sourceCompatibility 1.8
  }
}

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

第一個lambda表達式

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

?
1
2
3
4
5
6
button.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
       Log.d("TAG","按鈕被點擊,匿名內(nèi)部類");
     }
   });

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

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

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

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

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

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

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

?
1
2
3
4
5
//省略參數(shù)類型
(arg1,arg2...) -> {body}
 
//指定參數(shù)類型
(Type1 arg1,Type2 arg2...)->{body}

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

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

  1. 參數(shù)可以是零個或多個
  2. 參數(shù)類型可指定,可省略(根據(jù)表達式上下文推斷)
  3. 參數(shù)包含在圓括號中,用逗號分隔
  4. 表達式主體可以是零條或多條語句,包含在花括號中
  5. 表達式主體只有一條語句時,花括號可省略
  6. 表達式主體有一條以上語句時,表達式的返回類型與代碼塊的返回類型一致
  7. 表達式只有一條語句時,表達式的返回類型與該語句的返回類型一致
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//零個
 ()-> System.out.println("no argument");
 
//一個
 x->x+1
 
//兩個
 (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");
}
 
//返回類型是表達式主體語句的返回類型int
(int x)->x+1

lambda表達式的類型

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

?
1
2
3
4
5
6
7
8
View.OnClickListener listener = new View.OnClickListener() {
     @Override
     public void onClick(View v) {
       //...
     }
   };
   
button.setOnClickListener(listener);

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

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

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

?
1
2
3
4
5
6
7
8
public class View implements Drawable.Callback, KeyEvent.Callback,
    AccessibilityEventSource {
    ...
 public interface OnClickListener {
    void onClick(View v);
  }
  ...
  }

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

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

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

 

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

 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/JohnTsai/p/5584905.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男人女人日皮视频 | 日本欧美强乱视频在线 | 猥琐对着美女飞机喷到脸上 | 1919gogo女厕盗摄 | 99久久精品国产综合一区 | 亚洲精品二三区伊人久久 | 色中色软件 | 欧美精品一区二区三区免费 | 午夜宅男在线观看 | 国产自拍偷拍自拍 | 国产伦精品一区二区 | 美女扒开尿口让男生添 漫画 | 日本一区二区不卡久久入口 | 91精品久久国产青草 | 国产欧美一区二区三区久久 | 久久精品亚洲热综合一本 | 99在线精品免费视频九九视 | 亚洲狠狠婷婷综合久久久久网站 | 成人黄色a级片 | 亚洲天堂2016 | 456成人免费高清视频 | 99福利视频导航 | 四虎影视e456fcom四虎影视 | 91青青国产在线观看免费 | 成人午夜毛片 | 午夜伦理:伦理片 | 精品久久久噜噜噜久久久app | 114毛片免费观看网站 | 成年人黄色录像 | 日本精品人妖shemale人妖 | 色狠狠色狠狠综合天天 | h动态图男女啪啪27报 | 小早川怜子息梦精在线播放 | 欧美高清片| 视频二区 素人 欧美 日韩 | 亚洲精品久久久打桩机 | 啊啊啊好大视频 | 国产精品怡红院永久免费 | 欧美男男gaygaysxxx| a级精品九九九大片免费看 a级动漫 | 美女视频在线观看视频 |