精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android進(jìn)階之Kotlin高階函數(shù)和Lambda表達(dá)式詳細(xì)講解

移動(dòng)開發(fā) Android
Lambda語法在Java中已經(jīng)被廣泛的運(yùn)用,我們?cè)陂_發(fā)Android中幾乎上每一個(gè)項(xiàng)目也會(huì)在項(xiàng)目中接入Lambda插件,因?yàn)長ambda確實(shí)能簡少很多的代碼量。

[[415968]]

前言

Lambda語法在Java中已經(jīng)被廣泛的運(yùn)用,我們?cè)陂_發(fā)Android中幾乎上每一個(gè)項(xiàng)目也會(huì)在項(xiàng)目中接入Lambda插件,因?yàn)長ambda確實(shí)能簡少很多的代碼量。

無獨(dú)有偶,在Kotlin中也是Lambda語法的,在這篇文章中就詳細(xì)的為大家講解Lambda語法的編寫與使用

一、kotin高階函數(shù)詳解

1、高階函數(shù)是將函數(shù)用作參數(shù)或返回值的函數(shù)。這種函數(shù)的一個(gè)很好的例子是 lock(),它接受一個(gè)鎖對(duì)象和一個(gè)函數(shù),獲取鎖,運(yùn)行函數(shù)并釋放鎖:

  1. fun <T> lock(lock: Lock, body: () -> T): T { 
  2.     lock.lock() 
  3.     try { 
  4.         return body() 
  5.     } 
  6.     finally { 
  7.         lock.unlock() 
  8.     } 

body 擁有函數(shù)類型:() -> T,所以它應(yīng)該是一個(gè)不帶參數(shù)并且返回 T 類型值的函數(shù)。它在 try{: .keyword }-代碼塊內(nèi)部調(diào)用、被 lock 保護(hù),其結(jié)果由lock()函數(shù)返回。如果我們想調(diào)用lock()函數(shù),我們可以把另一個(gè)函數(shù)傳給它作為參數(shù)(參見函數(shù)引用)

2、如果一個(gè)函數(shù)接收另一個(gè)函數(shù)作為參數(shù),或者返回值的類型是另一個(gè)函數(shù),那么該函數(shù)就稱為高階函數(shù)

函數(shù)類型,基本規(guī)則如下:

(String,Int) -> Unit

現(xiàn)在將上述函數(shù)類型添加到某個(gè)函數(shù)的參數(shù)聲明或者返回值聲明上,那么這個(gè)函數(shù)就是一個(gè)高階函數(shù)了,例如

fun example(func: (String, Int) -> Unit) {

func("hello", 123)

}

可以看到這里的 example() 函數(shù)接收到了一個(gè)函數(shù)類型參數(shù),因此 example() 函數(shù)就是一個(gè)高階函數(shù);

這里我準(zhǔn)備定義一個(gè)叫作 num1AndNum2() 的高階函數(shù),讓它接收兩個(gè)整形和一個(gè)函數(shù)類型的參數(shù)。我們會(huì)在 num1AndNum2() 函數(shù)中對(duì)傳入的兩個(gè)整型參數(shù)進(jìn)行某種運(yùn)算,并返回運(yùn)行結(jié)果。但具體進(jìn)行什么運(yùn)算是由傳入的函數(shù)類型參數(shù)決定的

新建一個(gè)名為 Test1.kt 文件

  1. fun num1AndNum2(num1:Int,num2:Int,operation:(Int,Int)->Int):Int
  2.     val result = operation(num1,num2) 
  3.     return result 
  4. fun plus(num1: Int, num2: Int): Int { 
  5.     return num1 + num2 
  6. fun minus(num1: Int, num2: Int): Int { 
  7.     return num1 - num2 
  8.  main() 函數(shù) 
  9. fun main(){ 
  10.     val num1 = 100 
  11.     val num2 = 80 
  12.     val result1 = num1AndNum2(num1,num2, ::plus) 
  13.     val result2 = num1AndNum2(num1,num2,::minus) 
  14.     println("result1:"+result1) 
  15.     println("result2:"+result2) 
  16. result1:180 
  17. result1:20 

::plus 和 ::minus 的寫法,這是一種函數(shù)引用方式的寫法,表示將 plus() 和 minus() 函數(shù)作為參數(shù)傳遞給 num1AndNum2() 函數(shù)

如果每次調(diào)用任何高階函數(shù)時(shí)都還得先定義一個(gè)與其函數(shù)類型參數(shù)相匹配的函數(shù),是不是太復(fù)雜了?沒錯(cuò),因此 Kotlin 還支持其他多種方式來調(diào)用高階函數(shù),比如 Lambda 表達(dá)式、匿名函數(shù)、成員引用等。其中 Lambda 表達(dá)式是最常見也是最普遍的高階函數(shù)調(diào)用方式,剛才的代碼使用 Lambda 表達(dá)式來實(shí)現(xiàn)(Lambda 表達(dá)式最后一行自動(dòng)作為返回值),plus() 和 minus() 函數(shù)可以刪掉了

  1. fun main() { 
  2.     val num1 = 100 
  3.     val num2 = 80 
  4.     val result1 = num1AndNum2(num1, num2) { n1, n2 -> 
  5.         n1 + n2 
  6.     } 
  7.     val result2 = num1AndNum2(num1, num2) { n1, n2 -> 
  8.         n1 - n2 
  9.     } 
  10.     println("result1:" + result1) 
  11.     println("result2:" + result2) 
  12. fun num1AndNum2(num1: Int, num2: Int, operation: (IntInt) -> Int): Int { 
  13.     val result = operation(num1, num2) 
  14.     return result 

3、閉包函數(shù)

閉包函數(shù) 一個(gè)函數(shù)的返回值是函數(shù),函數(shù)的內(nèi)部包含另一個(gè)函數(shù),可以是有參無參的匿名函數(shù)

  1. fun main(args: Array<String>) { 
  2.     val mm = aaa() 
  3.     println(mm()) 
  4.     println(mm()) 
  5.     println(mm()) 
  6.     println(mm()) 
  7.     println(mm()) 
  8.     val  kk = bbb() 
  9.     println(kk("shadow")) //shadow --- 1 
  10.     println(kk("shadow")) //shadow --- 2 
  11.     println(kk("shadow")) //shadow --- 3 
  12.     println(kk("shadow")) //shadow --- 4 
  13.     println(kk("shadow")) //shadow --- 5 
  14. //閉包函數(shù) 就是函數(shù)作為返回參數(shù) 
  15. fun aaa(): () -> (Int) { 
  16.     var current = 10 
  17.     return fun(): Int { 
  18.         return current++ 
  19.     } 
  20. fun bbb(): (String) -> (String) { 
  21.     var current = 0; 
  22.     return fun(str: String): String { 
  23.         current++; 
  24.         return "$str --- $current"
  25.     } 

4、kotin中高階函數(shù)案例

map 變換

  1. fun main(args: Array<String>) { 
  2.     val list = listOf(1, 2, 3, 4, 5, 6) 
  3.     val newList = list.map { 
  4.         //對(duì)集合中的數(shù)據(jù)進(jìn)行操作,然后賦值給新的集合 
  5.         (it * 2).toString() 
  6.     }.forEach(::println) //2 4 6 8 10 12 
  7.     val doubleList = list.map { 
  8.         it.toDouble() 
  9.     }.forEach(::print) //1.0 2.0 3.0 4.0 5.0 6.0 
  10.     //函數(shù)作為參數(shù)的第二種方式調(diào)用 類名::方法名 
  11.     val doubleList2 = list.map(Int::toDouble).forEach(::print) ////1.0 2.0 3.0 4.0 5.0 6.0 

flatMap 對(duì)集合的集合進(jìn)行變換

  1. fun main(args: Array<String>) { 
  2.     val list = arrayOf( 
  3.         1..5, 
  4.         50..55 
  5.     ) 
  6.     //把多個(gè)數(shù)組集合變成一個(gè)數(shù)組,并且對(duì)數(shù)據(jù)進(jìn)行變換 
  7.     val mergeList = list.flatMap { intRange -> //集合內(nèi)的集合 1..5 , 50..55 
  8.         intRange.map { intElement -> //集合內(nèi)集合遍歷 1,2,3,4,5 
  9.             "No.$intElement" 
  10.         } 
  11.     } 
  12.     //No.1 , No.2 , No.3 , No.4 , No.5 , No.50 , No.51 , No.52 , No.53 , No.54 , No.55 , 
  13.     mergeList.forEach { print("$it , ") } 
  14.     println() 
  15.     //直接多個(gè)數(shù)組集合變換成一個(gè)結(jié)集合 
  16.     val newList = list.flatMap { 
  17.         it 
  18.     } 
  19.     //1 , 2 , 3 , 4 , 5 , 50 , 51 , 52 , 53 , 54 , 55 , 
  20.     newList.forEach { print("$it , ") } 

filter 篩選

  1. fun main(args: Array<String>) { 
  2.     val list = arrayOf( 
  3.         1..5, 
  4.         2..3 
  5.     ) 
  6.     val newList = list.flatMap { 
  7.         it 
  8.     } 
  9.     //篩選 集合中數(shù)據(jù) > 2的item 
  10.     val filterList = newList.filter { it > 2 } 
  11.     filterList.forEach(::print) //3453 
  12.     //篩選 集合中下標(biāo)是奇數(shù)item 
  13.     val filterIndexList = newList.filterIndexed { index, i -> index % 2 == 0; } 
  14.     filterIndexList.forEach { print(it) } //1 3 5 3 

forEach

  1. fun main(args: Array<String>) { 
  2.     var list = listOf(1, 2, 3, 4, 5, 6) 
  3.     list.forEach(::println) 
  4.     val newList = arrayListOf<String>() --->1,2,3,4,5,6 
  5.     list.forEach { 
  6.         newList.add((it * 2).toString()) --->2,4,6,8,10,12 
  7.     } 
  8.     newList.forEach(::println) 

下面我們就來介紹Lambda

二、Lambda表達(dá)式詳解

1、Lambda表達(dá)式是什么?

  • Lambda表達(dá)式是JDK8推出一個(gè)重要的新特性,雖然看著很高大上,其實(shí)Lambda表達(dá)式的本質(zhì)只是一個(gè)”語法糖”,習(xí)慣了面向?qū)ο缶幊痰乃枷耄婚_始看起來會(huì)有點(diǎn)不習(xí)慣這種語法形式,但如果你學(xué)過C#,你就會(huì)發(fā)現(xiàn)語法和C#中的“委托”很像;
  • 大家都知道,在Java中萬物皆對(duì)象,Java 一直都致力維護(hù)其對(duì)象至上的特征,函數(shù)對(duì) Java 而言雖然重要,但在 Java 的世界里,函數(shù)無法獨(dú)立存在,只能依賴于對(duì)象來調(diào)用。在函數(shù)式編程語言中,函數(shù)是一等公民,它們可以獨(dú)立存在,你可以將其賦值給一個(gè)變量,或?qū)⑺麄儺?dāng)做參數(shù)傳給其他函數(shù)。JavaScript 就是函數(shù)式編程語言最典型的代表;
  • 函數(shù)式語言提供了一種強(qiáng)大的功能——閉包,相比于傳統(tǒng)的編程方法有很多優(yōu)勢(shì),閉包是一個(gè)可調(diào)用的對(duì)象,它記錄了一些信息,這些信息來自于創(chuàng)建它的作用域。因此Java 現(xiàn)在提供的最接近閉包的概念便是 Lambda 表達(dá)式,雖然閉包與 Lambda 表達(dá)式之間存在顯著差別,但至少 Lambda 表達(dá)式是閉包很好的替代者;
  • 使用Lambda表達(dá)式的目的就是取代大部分的匿名內(nèi)部類,讓我們能寫出更簡潔優(yōu)雅的 Java 代碼,尤其在集合的遍歷和其他集合操作中,可以極大地優(yōu)化代碼結(jié)構(gòu)。JDK 也提供了大量的內(nèi)置函數(shù)式接口供我們使用,使得 Lambda 表達(dá)式的運(yùn)用更加方便、高效;
  • 如果在你沒有熟練掌握Lambda表達(dá)式時(shí),不建議亂用,因?yàn)椴皇褂肔ambda表達(dá)式,你同樣可以實(shí)現(xiàn)相應(yīng)功能,只把它當(dāng)做一種錦上添花的工具就可以了;

2、Lambda表達(dá)式語法結(jié)構(gòu)

Lambda表達(dá)式基礎(chǔ)語法結(jié)構(gòu)如下:

  1. (parameters) -> expression 
  2. 或 
  3. (parameters) ->{ statements; } 

其中 () 用來描述參數(shù)列表,{} 用來描述方法體,-> 為 lambda運(yùn)算符 ,讀作(goes to),parameters表示參數(shù),expression表示表達(dá)式,statements表示代碼塊。

結(jié)構(gòu)說明如下:

一個(gè) Lambda 表達(dá)式可以有零個(gè)或多個(gè)參數(shù)

參數(shù)的類型既可以明確聲明,也可以根據(jù)上下文來推斷。

例如:

(int a)與(a)效果相同

所有參數(shù)需包含在圓括號(hào)內(nèi),參數(shù)之間用逗號(hào)相隔。

例如:

  1. (a, b) 或 (int a, int b) 或 (String a, int b, float c) 

空?qǐng)A括號(hào)代表參數(shù)集為空。例如:() -> 42

當(dāng)只有一個(gè)參數(shù),且其類型可推導(dǎo)時(shí),圓括號(hào)()可省略。

例如:a -> return a*a

Lambda 表達(dá)式的主體可包含零條或多條語句

如果 Lambda 表達(dá)式的主體只有一條語句,花括號(hào){}可省略。匿名函數(shù)的返回類型與該主體表達(dá)式一致;

如果 Lambda 表達(dá)式的主體包含一條以上語句,則表達(dá)式必須包含在花括號(hào){}中(形成代碼塊)。匿名函數(shù)的返回類型與代碼塊的返回類型一致,若沒有返回則為空;

3、Lambda表達(dá)式重要特征

  • 可選類型聲明:不需要聲明參數(shù)類型,編譯器可以統(tǒng)一識(shí)別參數(shù)值。
  • 可選的參數(shù)圓括號(hào):一個(gè)參數(shù)無需定義圓括號(hào),但多個(gè)參數(shù)需要定義圓括號(hào)。
  • 可選的大括號(hào):如果主體包含了一個(gè)語句,就不需要使用大括號(hào)。
  • 可選的返回關(guān)鍵字:如果主體只有一個(gè)表達(dá)式返回值則編譯器會(huì)自動(dòng)返回值,大括號(hào)需要指定明表達(dá)式返回了一個(gè)數(shù)值。

4、函數(shù)式接口詳解

①什么是函數(shù)式接口

函數(shù)式接口在java中是指只有一個(gè)抽象方法的接口。

函數(shù)式接口,就是適用于函數(shù)式編程場(chǎng)景的接口。在java中函數(shù)式編程就體現(xiàn)在Lambda,因此函數(shù)式接口就是能夠適用于lambda使用的接口。只有確保接口中有且僅有一個(gè)抽象方法,lambda才能進(jìn)行順利的推導(dǎo);

②語法

@FunctionalInterface注解

注解和@override注解的作用類似。該住處應(yīng)用于函數(shù)式接口的定義上。

一旦使用了該注解來定義函數(shù)式接口,編譯器就會(huì)檢查該接口是否是有且僅有一個(gè)抽象方法

  1. @FunctionalInterface 
  2. public interface MyFunctionalInterface { 
  3.       void myMethod(); 
  4. 將函數(shù)式接口作為方法的參數(shù) 
  5. public class Demo { 
  6.     private static void dos(FunctionInterface fi){ 
  7.         fi.method(); 
  8.     } 
  9.     public static void main(String[] args) { 
  10.         Demo.dos(()->{System.out.println("lambda表達(dá)式");}); 
  11.     } 

5、Lambda表達(dá)式基本使用案例

表達(dá)式基本使用案例

  1. // 1. 不需要參數(shù),返回值為 5   
  2. () -> 5   
  3. // 2. 接收一個(gè)參數(shù)(數(shù)字類型),返回其2倍的值   
  4. x -> 2 * x   
  5. // 3. 接受2個(gè)參數(shù)(數(shù)字),并返回他們的差值   
  6. (x, y) -> x – y   
  7. // 4. 接收2個(gè)int型整數(shù),返回他們的和   
  8. (int x, int y) -> x + y   
  9. // 5. 接受一個(gè) string 對(duì)象,并在控制臺(tái)打印,不返回任何值(看起來像是返回void)   
  10. (String s) -> System.out.print(s) 
  11. 定義6個(gè)接口,后面我們都會(huì)基于這6個(gè)接口來演示案例 
  12. /**多參數(shù)無返回*/ 
  1. @FunctionalInterface 
  2. public interface NoReturnMultiParam { 
  3.     void method(int a, int b); 
  4. /**無參無返回值*/ 
  5. @FunctionalInterface 
  6. public interface NoReturnNoParam { 
  7.     void method(); 
  8. /**一個(gè)參數(shù)無返回*/ 
  9. @FunctionalInterface 
  10. public interface NoReturnOneParam { 
  11.     void method(int a); 
  12. /**多個(gè)參數(shù)有返回值*/ 
  13. @FunctionalInterface 
  14. public interface ReturnMultiParam { 
  15.     int method(int a, int b); 
  16. /** 無參有返回*/ 
  17. @FunctionalInterface 
  18. public interface ReturnNoParam { 
  19.     int method(); 
  20. /**一個(gè)參數(shù)有返回值*/ 
  21. @FunctionalInterface 
  22. public interface ReturnOneParam { 
  23.     int method(int a); 
  24. 案例代碼: 
  25. public class Test2 { 
  26.     public static void main(String[] args) { 
  27.         //1.簡化參數(shù)類型,可以不寫參數(shù)類型,但是必須所有參數(shù)都不寫 
  28.         NoReturnMultiParam lamdba1 = (a, b) -> { 
  29.             System.out.println("簡化參數(shù)類型"); 
  30.         }; 
  31.         lamdba1.method(1, 2); 
  32.         //2.簡化參數(shù)小括號(hào),如果只有一個(gè)參數(shù)則可以省略參數(shù)小括號(hào) 
  33.         NoReturnOneParam lambda2 = a -> { 
  34.             System.out.println("簡化參數(shù)小括號(hào)"); 
  35.         }; 
  36.         lambda2.method(1); 
  37.         //3.簡化方法體大括號(hào),如果方法條只有一條語句,則可以省略方法體大括號(hào),類似if或for 
  38.         NoReturnNoParam lambda3 = () -> System.out.println("簡化方法體大括號(hào)"); 
  39.         lambda3.method(); 
  40.         //4.如果方法體只有一條語句,并且是 return 語句,則可以省略方法體大括號(hào) 
  41.         ReturnOneParam lambda4 = a -> a+3; 
  42.         System.out.println(lambda4.method(5)); 
  43.         ReturnMultiParam lambda5 = (a, b) -> a+b; 
  44.         System.out.println(lambda5.method(1, 1)); 
  45.     } 

6、使用lambda 表達(dá)式去引用方法

①引用方法的語法為:方法歸屬者::方法名

注意:靜態(tài)方法的歸屬者為類名,普通方法歸屬者為對(duì)象。該代碼案例結(jié)合最上面的自定義函數(shù)式接口:

  1. public class Exe1 { 
  2.     public static void main(String[] args) { 
  3.         ReturnOneParam lambda1 = a -> doubleNum(a); 
  4.         System.out.println(lambda1.method(3)); 
  5.         //lambda2 引用了已經(jīng)實(shí)現(xiàn)的 doubleNum 方法 
  6.         ReturnOneParam lambda2 = Exe1::doubleNum; 
  7.         System.out.println(lambda2.method(3)); 
  8.         Exe1 exe = new Exe1(); 
  9.         //lambda4 引用了已經(jīng)實(shí)現(xiàn)的 addTwo 方法 
  10.         ReturnOneParam lambda4 = exe::addTwo; 
  11.         System.out.println(lambda4.method(2)); 
  12.     } 
  13.     /** 
  14.      * 要求 
  15.      * 1.參數(shù)數(shù)量和類型要與接口中定義的一致 
  16.      * 2.返回值類型要與接口中定義的一致 
  17.      */ 
  18.     public static int doubleNum(int a) { 
  19.         return a * 2; 
  20.     } 
  21.     public int addTwo(int a) { 
  22.         return a + 2; 
  23.     } 

②構(gòu)造方法的引用

一般我們需要聲明接口,該接口作為對(duì)象的生成器,通過 類名::new 的方式來實(shí)例化對(duì)象,然后調(diào)用方法返回對(duì)象。

  1. interface ItemCreatorBlankConstruct { 
  2.     Item getItem(); 
  3. interface ItemCreatorParamContruct { 
  4.     Item getItem(int id, String namedouble price); 
  5. public class Exe2 { 
  6.     public static void main(String[] args) { 
  7.         ItemCreatorBlankConstruct creator = () -> new Item(); 
  8.         Item item = creator.getItem(); 
  9.         ItemCreatorBlankConstruct creator2 = Item::new; 
  10.         Item item2 = creator2.getItem(); 
  11.         ItemCreatorParamContruct creator3 = Item::new; 
  12.         Item item3 = creator3.getItem(119, "電腦", 5888.88); 
  13.     } 

使用匿名類與 Lambda 表達(dá)式的一大區(qū)別在于關(guān)鍵詞的使用。

對(duì)于匿名類,關(guān)鍵詞 this 解讀為匿名類,而對(duì)于 Lambda 表達(dá)式,關(guān)鍵詞 this 解讀為寫就 Lambda 的外部類

7、Lambda再次總結(jié)

  • 無參、無返回值的函數(shù)類型(Unit 返回類型不可省略):() -> Unit;
  • 接收T類型參數(shù)、無返回值的函數(shù)類型:(T) -> Unit;
  • 接收T類型和A類型參數(shù)、無返回值的函數(shù)類型(多個(gè)參數(shù)同理):(T,A) -> Unit;
  • 接收T類型參數(shù),并且返回R類型值的函數(shù)類型:(T) -> R;
  • 接收T類型和A類型參數(shù)、并且返回R類型值的函數(shù)類型(多個(gè)參數(shù)同理):(T,A) -> R;
  • 在大括號(hào){}的方法實(shí)現(xiàn)里,如果只有一個(gè)參數(shù),可以用it指定而不需要再寫x->...這種代碼;
  • 如果方法實(shí)現(xiàn)里有多個(gè)參數(shù),則需要x:Int,y:Int->...這種方式指明->后面的自定義參數(shù)名;

總結(jié)

1、Lambda和高階函數(shù)理解起來有點(diǎn)繞,需要大量的練習(xí)和實(shí)驗(yàn)才能慢慢的理解

 

2、Lambda很深,我們一起來學(xué)習(xí)進(jìn)步

 

責(zé)任編輯:武曉燕 來源: Android開發(fā)編程
相關(guān)推薦

2009-09-17 10:40:22

Linq Lambda

2023-11-02 08:25:58

C++Lambda

2023-12-13 10:12:40

Python函數(shù)lambda

2022-11-29 11:00:04

Lambda表達(dá)式Java

2021-08-05 20:39:34

AndroidKotlinStandard.kt

2009-08-31 17:11:37

Lambda表達(dá)式

2009-09-17 09:09:50

Lambda表達(dá)式Linq查詢

2021-08-31 07:19:41

Lambda表達(dá)式C#

2020-10-16 06:40:25

C++匿名函數(shù)

2009-09-15 15:18:00

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2022-12-05 09:31:51

接口lambda表達(dá)式

2023-11-02 18:45:00

Rust編程表達(dá)式

2009-09-11 09:48:27

Linq Lambda

2024-12-02 10:56:29

2009-08-10 17:11:34

.NET 3.5擴(kuò)展方Lambda表達(dá)式

2009-10-12 10:11:08

Lambda表達(dá)式編寫

2009-09-17 14:21:19

LINQ表達(dá)式

2009-09-17 09:44:54

Linq Lambda

2009-09-15 17:30:00

Linq Lambda
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久成人综合网| 国产一区2区| 粉嫩av一区二区三区免费野| 日韩福利视频| 伊人久久一区二区| 激情一区二区| 最近的2019中文字幕免费一页| 亚洲在线观看网站| 女生影院久久| 一区二区三区四区精品在线视频| 久久精品国产一区二区三区日韩| 一级特黄aa大片| 欧美亚洲视频| 欧美日韩国产999| 亚洲精品国产91| julia中文字幕一区二区99在线| 在线精品视频一区二区三四 | www.99r| av手机免费在线观看| 国产精品免费aⅴ片在线观看| 国产乱子伦精品| 91丨九色丨丰满| 久久久久久久欧美精品| 色综合男人天堂| 精品无码一区二区三区蜜臀| 一区二区三区视频免费观看| 欧美精品一区二| 亚洲一区在线不卡| 国产高清不卡| 五月综合激情网| 99久热在线精品视频| 99se视频在线观看| 久久精品一二三| 久久精品ww人人做人人爽| 亚洲av永久纯肉无码精品动漫| 蜜桃免费网站一区二区三区| 日韩av免费在线观看| 制服.丝袜.亚洲.中文.综合懂色| 国产一区视频在线观看免费| 欧美另类xxx| 男女性高潮免费网站| 亚洲91中文字幕无线码三区| 少妇久久久久久| 国产亚洲精品精品精品| 精品久久91| 亚洲片av在线| 91成年人网站| 国产欧美日韩在线一区二区 | 变态另类丨国产精品| 9国产精品午夜| 精品日韩一区二区三区| 久久久久亚洲av片无码v| 国产美女精品视频免费播放软件| 欧美精品三级日韩久久| 在线免费看污网站| 久久久91麻豆精品国产一区| 91精品国产综合久久小美女| a级大片免费看| 超碰在线亚洲| 亚洲精品720p| 日韩av在线看免费观看| 精品国产123区| 一区二区欧美亚洲| 在线免费看av网站| 91精品一区国产高清在线gif| 久久久精品电影| 久久久国产成人| 91久久中文| 国产成人久久精品| 在线观看国产一区二区三区| 国产综合久久久久久久久久久久| 亚洲mm色国产网站| 成人免费公开视频| 久久蜜桃av一区二区天堂| 日韩国产精品一区二区| 免费av不卡| 亚洲一二三区在线观看| 成年人观看网站| 图片一区二区| 精品电影一区二区三区| 18禁裸乳无遮挡啪啪无码免费| 国产日产一区 | 精品999久久久| 日本黄色特级片| 五月天久久777| 97久久国产精品| 国产精品传媒在线观看| 国产精品18久久久久久久久 | 岛国av一区二区| 国产aaaaa毛片| 6080亚洲理论片在线观看| 亚洲欧美精品一区二区| 日本美女黄色一级片| 在线欧美三区| 国产裸体写真av一区二区 | 国产亚洲观看| 国产午夜精品理论片a级探花| 亚洲欧洲综合网| 国产精品久久久久9999高清| 91久久国产综合久久91精品网站| 丰满少妇在线观看bd| 中文字幕二三区不卡| 国产真实老熟女无套内射| 久久久精品三级| 日韩最新av| 天天精品视频| 制服.丝袜.亚洲.另类.中文| 超碰男人的天堂| 999视频精品| 青草青草久热精品视频在线观看| 国产区精品在线| 国产欧美日韩一区二区三区在线观看| 麻豆传媒网站在线观看| 日本国产欧美| 日韩av中文字幕在线免费观看| 免费黄色激情视频| 日韩电影在线免费观看| 国产麻豆日韩| av色综合久久天堂av色综合在| 91国产成人在线| 中文字幕在线观看网址| 一区在线视频观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 九色在线播放| 欧美日韩精品国产| 中文字幕在线播放一区二区| 99tv成人| 国产日韩欧美夫妻视频在线观看| 久久国产精品高清一区二区三区| 午夜视频在线观看一区二区| www.久久com| 亚洲成av人片一区二区密柚| 国产日韩欧美中文| 1区2区3区在线观看| 在线视频欧美精品| 久久丫精品国产亚洲av不卡| av成人毛片| 精品毛片久久久久久| 超碰在线97国产| 精品福利视频一区二区三区| 久久国产精品二区| 国产高清成人在线| 美女av免费观看| 亚洲精品v亚洲精品v日韩精品| 欧美日韩第一页| 亚洲乱码在线观看| 亚洲图片欧美色图| 欧美精品欧美极品欧美激情| 亚洲一区中文| 欧美在线一二三区| 亚洲成人va| 色偷偷偷亚洲综合网另类| 国产精品无码一本二本三本色| 天堂网一区二区| 91免费视频观看| 男人亚洲天堂网| 精品国产91乱码一区二区三区四区| 日韩**中文字幕毛片| 国产三级视频在线播放线观看| 色噜噜偷拍精品综合在线| av网站免费在线看| 日本成人在线不卡视频| 亚洲啪啪av| 国产精品2区| 久久免费视频观看| 欧美大片aaa| 欧美日韩一区三区四区| 天天爽天天爽天天爽| 国产精品一区二区在线看| 国产天堂视频在线观看| 9l视频自拍蝌蚪9l视频成人| 欧美一级电影久久| www黄在线观看| 91精品国产色综合久久不卡电影| 18岁成人毛片| 91亚洲精品久久久蜜桃网站| 久久久久久久久久福利| 久久精品国产68国产精品亚洲| 91久久久国产精品| 超碰资源在线| 国产亚洲人成a一在线v站| 国产三级三级在线观看| 亚欧成人精品| 欧美久久久影院| 暗呦丨小u女国产精品| 成人性生交大合| 日韩免费高清在线| 欧美在线亚洲| 欧美久久电影| 精品视频成人| 日韩av片免费在线观看| 羞羞的视频在线观看| 亚洲精品综合久久中文字幕| 国产精品久久影视| 欧美性猛交xxxx乱大交蜜桃| 亚洲人做受高潮| av成人免费在线| 中文字幕线观看| 久久精品人人做人人爽电影蜜月| 99精品一区二区三区的区别| 综合伊思人在钱三区| 91久久精品久久国产性色也91 | 欧美中文在线视频| 黄网站免费在线播放| 国产视频自拍一区| 精品国产亚洲AV| 欧美色精品天天在线观看视频| 久久影院一区二区| 亚洲欧洲性图库| 欧洲美一区二区三区亚洲 | 国产麻豆一区二区三区在线观看| 成人做爰免费视频免费看| 午夜精品久久久久久久久久久久| 美女国产在线| 中文字幕精品一区久久久久| 无码国产色欲xxxx视频| 日韩手机在线导航| 中文字幕日韩经典| 色综合欧美在线| 日干夜干天天干| 一区二区三区蜜桃网| 久久视频一区二区三区| 久久久久国产免费免费| 好男人香蕉影院| 高清成人在线观看| 亚洲精品免费一区亚洲精品免费精品一区| 六月天综合网| 免费看日本毛片| 亚洲调教视频在线观看| 女女百合国产免费网站| 福利视频在线导航| 久久99精品国产麻豆婷婷| 又粗又黑又大的吊av| 影音先锋亚洲精品| 日韩一级性生活片| 亚洲婷婷在线| 男的插女的下面视频| 亚洲视频中文| 夜夜添无码一区二区三区| 欧美午夜不卡| 亚洲 欧美 综合 另类 中字| 国产精品mm| 美女扒开大腿让男人桶| 激情成人亚洲| 久久亚洲中文字幕无码| av成人国产| 18禁免费无码无遮挡不卡网站| 亚洲精华国产欧美| 日韩av黄色网址| 久久精品一区二区三区中文字幕| 无码aⅴ精品一区二区三区浪潮 | 污片在线观看一区二区| 日本五十路女优| 欧美日韩精品在线视频| 在线观看免费av片| 日本高清免费不卡视频| 在线观看毛片网站| 欧美一区二区三区在线视频| a级片在线视频| 亚洲第一男人av| 日本福利片在线| 一色桃子一区二区| 欧美成人性生活视频| 欧美成人免费在线视频| 激情av在线| 日韩av男人的天堂| 人人玩人人添人人澡欧美| 亚洲一区二区三区xxx视频| 136福利精品导航| 久久国产精品99久久久久久丝袜| 国产成人一区二区三区影院| 亚洲国产欧美不卡在线观看| 亚洲色图网站| 久久精品视频16| 另类专区欧美蜜桃臀第一页| 欧美人与性动交α欧美精品| 99re免费视频精品全部| 日本一道本视频| 一区二区三区四区蜜桃| 特级毛片www| 欧美久久久久中文字幕| 天天色天天操天天射| 中文字幕亚洲综合久久| 欧美6一10sex性hd| 国产精品99久久久久久www| 亚洲黑人在线| 精品欧美一区二区精品久久| 日韩精品免费一区二区在线观看| 日本久久久网站| 日韩av一级电影| 少妇精品无码一区二区| 国产欧美一区二区精品性色超碰| 麻豆明星ai换脸视频| 欧美性猛交视频| 精品人妻久久久久一区二区三区| 亚洲男人天堂2019| 羞羞电影在线观看www| 国产精品久久久久久av| 99精品在免费线中文字幕网站一区| 神马影院我不卡午夜| 很黄很黄激情成人| 亚洲综合婷婷久久| 91麻豆精东视频| 青娱乐国产精品| 在线观看视频一区二区欧美日韩| 亚洲精品久久久久久久久久| 中文字幕欧美国内| 樱花草涩涩www在线播放| 亚洲专区在线视频| 俺要去色综合狠狠| 92看片淫黄大片一级| 国产成人午夜精品影院观看视频| 国产视频不卡在线| 日韩欧美国产黄色| 韩国av在线免费观看| 久久久精品日本| 免费观看成人性生生活片| 激情伦成人综合小说| 国产精品久久| 美女被艹视频网站| 亚洲天堂中文字幕| 在线视频 中文字幕| 亚洲天堂av女优| 综合日韩av| 久久久一本精品99久久精品66 | 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲国产美女搞黄色| 99久久久国产精品无码免费| 日韩中文视频免费在线观看| 78精品国产综合久久香蕉| 欧美12av| 久久青草久久| 日韩精品电影一区二区| 欧美日韩免费一区| 无码精品黑人一区二区三区| 97在线免费观看视频| 老汉色老汉首页av亚洲| av在线播放亚洲| www.亚洲激情.com| 久久不卡免费视频| 亚洲精品国精品久久99热| brazzers在线观看| 国产亚洲福利社区| 香蕉国产精品偷在线观看不卡| 国产福利在线观看视频| 欧美日韩一区二区精品| 黄色在线观看网| 国产91网红主播在线观看| 欧洲三级视频| 色婷婷成人在线| 成人免费视频在线观看| 国产精品无码专区av免费播放| 操91在线视频| 99re热精品视频| 国产青青在线视频| 久久久久久久久99精品| 免费在线不卡av| 久久精品成人欧美大片古装| 精品久久国产一区| 亚洲中文字幕无码av永久| 26uuu亚洲| 在线视频欧美亚洲| 色综合天天综合网国产成人网| 精品av导航| 亚洲狼人综合干| 亚洲欧美色图小说| 午夜成人免费影院| 国产99久久精品一区二区| 波多野结衣在线观看一区二区三区 | 69精品久久久| 亚洲女人被黑人巨大进入| 黄色成人在线观看网站| 男女啪啪免费观看| av在线不卡电影| 国产偷人爽久久久久久老妇app| 久久精品亚洲一区| 欧美爱爱网站| 91高清国产视频| 亚洲高清免费一级二级三级| 欧洲天堂在线观看| 亚洲一区国产精品| 国产一区二区三区久久久久久久久| 欧美日韩生活片| 欧美精品一区二区蜜臀亚洲| 成人性片免费| 青青草国产精品视频| 国产精品美女久久久久久久久久久 | 国产乱子轮精品视频| 久久精品视频7| 久久精视频免费在线久久完整在线看| 久久久久观看| 午夜免费看毛片| 欧美性高跟鞋xxxxhd| 羞羞的视频在线看| 一道精品一区二区三区| 99久久精品国产网站| 国产精品久久久久久久一区二区| 欧美在线视频免费播放| 欧美一区在线看|