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

Scala講座:函數式語言的體驗

開發 后端
本文選自Scala講座的第五篇的內容,介紹了Scala的函數定義,引入單例對象內的方法,匿名函數的定義,在表達式中作為占位符的下劃線,部分函數的定義,Scala中方法和函數的關系,高階函數和延遲評估參數,模式匹配,Case類,將模式匹配與for語句組合,希望大家喜歡。

本文節選自最近在日本十分流行的Scala講座系列的第五篇,由JavaEye的fineqtbull翻譯。本系列的作者牛尾剛在日本寫過不少有關Java和Ruby的書籍,相當受歡迎。

序言

這一次講的不是作為Java改良版的Scala語言中所具有強大的純面向對象功能,而是以函數式語言來介紹他。函數本身是對象,他可以被賦值給變量,或者作為方法的參數來傳遞,我們把他作為“第一類對象”來看一下他的處理方法。另外也讓讀者體驗一下函數式語言特有的模式匹配的強大功能。好,讓我們馬上出發,開始我們第三次迷你旅行吧。

Scala的函數定義

在Scala中方法被作為函數用def語句以“def 函數名(參數類表): 返回值 = 函數體”格式來定義。

  1. def foo(s: String, n: Int): Int = {  
  2. s.length * n  
  3. }  

但是函數體僅由單個句子來構成的話可以省略{}。

  1. def foo(s: String, n: Int): Int = s.length * n 

還有,類型推斷對于返回值也是有效的,在允許的情況下是可以省略他的類型的(函數定義中,參數的類型則不可省略)。但是為了理解方便,除了交互式環境下以腳本語言方式使用外,還是作為標記保留下來比較好吧。

  1. scala> def foo(s: String, n: Int) = s.length * n  
  2. foo: (String,Int)Int  
  3. scala> foo("Zhang Fei"3)  
  4. res0: Int = 27 

為了聲明無返回值的函數可以將返回值定義為Unit。這個與Java中的void相同。

  1. def bar(s: String, n: Int): Unit = for(i <- 1 to n) print(s) 

上述函數的目的是為了執行被認為是副作用的打印n次傳入字符串,所以返回值是Unit。附帶說一下,Unit唯一的實例是用()文本來表示。

引入單例對象內的方法

這些方法一般都定義在類之中,但是如果想單獨使用它的話,通常將其定義在單例對象中。

  1. object MyFunctions {  
  2. def foo(s: String, n: Int): Int = s.length * n  
  3. def bar(s: String, n: Int): Unit = for(i <- 1 to n) print(s)  
  4. }  

為了使用foo或bar這些方法,通常指定單例對象名和方法名來調用他。

  1. scala> MyFunctions.foo("Zhang Fei"3)  
  2. res1: Int = 27 
  3. scala> MyFunctions.bar("Zhang Fei"3)  
  4. Zhang FeiZhang FeiZhang Fei  

如下所示將方法引入之后就不用一次一次的指定單例對象名了。下面引入了所有MyFunctions里的方法。

  1. scala> import MyFunctions._  
  2. import MyFunctions._  
  3. scala> foo("Zhang Fei"3)  
  4. res0: Int = 27 
  5. scala> bar("Zhang Fei"3)  
  6. Zhang FeiZhang FeiZhang Fei  

匿名函數的定義

到此為止,每一次的函數定義中都指定了函數名,但是如果能不指定函數名就更方便了。因為即使沒有函數名,只要將函數體作為參數來傳遞或賦值給變量之后,該函數實例也就能確定了。這類函數稱為匿名函數(anonymous function),以“參數表 => 函數體”格式來定義。例如可以用如下形式來定義取得字符串長度的函數。

  1. scala> (s:String) => s.length 

如果僅這樣定義的話,該語句結束后該函數就消失了,為了能夠持續使用該函數就需要,或者持續定義該函數并適用他,或者將他賦值給變量,或者將他作為參數傳給別的函數。

  1. scala> ((s:String) => s.length)( "Zhang Fei"//對字符串直接適用函數文本  
  2. res2: Int = 9 
  3.  
  4. scala> val ssize = (s:String) => s.length //將函數賦值給變量  
  5. ssize: (String) => Int =   
  6. scala> ssize("Zhang Fei"//用變量來調用函數  
  7. res3: Int = 9 
  8. scala> List("Zhang ""Fei").map((s:String) => s.length) //對于列表每一項目都適用同一函數文本  
  9. res4: List[Int] = List(63)  
  10. scala> List("Zhang ""Fei").map(ssize) //對于列表每一項目都適用同一函數變量  
  11. res5: List[Int] = List(63)   

上述最后兩個例子中使用了map函數,他對列表中的每一項目都適用作為參數傳入的函數之后將適用結果作為列表返回。函數則是由函數文本(s:String) => s.length或函數變量ssize來指定的。這也是閉包的一個例子,在Scala中用函數來定義閉包。任意的函數都可以作為參數來傳給別的函數。

例如前面的bar函數如下所示

  1. def bar(s: String, n: Int): Unit = for(i <- 1 to n) print(s) 

這也可以用匿名函數來定義,這次是有兩個參數且返回值是Unit的函數。

  1. scala> val f0 = (s:String, n:Int) => for(i <- 1 to n) print(s)  
  2. f0: (String, Int) => Unit =  

這個函數中用for語句進行了n次循環,其實還可以改寫成如下形式。

  1. def bar(s: String, n: Int): Unit = 1 to n foreach {i => print(s)} 

函數體中出現的{i => print(s)}就是以匿名函數形式定義的閉包。1 to n是1.to(n)的簡化形式,然后將閉包作為參數傳遞給剛創建的Range對象的foreach方法(參數i在閉包的函數體中并沒有被使用,僅是為了語法需要)。

在表達式中作為占位符的下劃線

實際上,Scala中備有比匿名函數更簡潔的描述方式。

如下所示,對于“(s:String) => s.length”來說,可以用“_”以“( _:String).length”形式來描述。還有可以用“(_:Int)+(_:Int)”來定義類型為“(Int, Int) => Int”的加法表達式。

  1. scala> ((_:String).length)("abcde")  
  2. res6: Int = 5 
  3. scala> ((_:Int)+(_:Int))(34)  
  4. res7: Int = 7 
  5. scala> ((_:String).length + (_:Int)) ("abc"4)  
  6. res8: Int = 7 

部分函數的定義

Scala中不僅可以用到現在所看到的式子來定義,還可以通過將具體的實例一排排列出后,用類似于數學中學到的映像圖的形式來描述。聲明了“f1:A=>B”之后可以認為是定義了將類型A映像為類型B的函數f1。實際上這可以認為是將函數定義為類Function1[A, B]的實例(圖 6-1)。

  1. def f1: Symbol=>Int = {  
  2. case 'a => 1 
  3. case 'b => 2 
  4. case 'c => 3 
  5. }  
  6. scala> f1('c)  
  7. res9: Int = 3 
  8. scala> f1('d)  
  9. scala.MatchError: 'd  
  10. at $anonfun$f1$1.apply(:8)  
  11. at $anonfun$f1$1.apply(:8)  
  12. at .(:10)  
  13. at .()  
  14. at RequestResult$.(:3)  
  15. at RequestResult$.()  
  16. at RequestResult$result()  
  17. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  18. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)... 

圖 6-1定義為源值域與目標值域映像的函數 

圖 6-1定義為源值域與目標值域映像的函數

函數本來不就因該是這樣的嗎?但是問題是,如果將函數定義域中沒有的參數傳給f1函數后將會拋出例外。為了避免這種情況在對于某一值適用函數前可以先檢查一下該值是否在定義域中。部分函數(PartialFunction)定義為我們提供了這種結構。

  1. def f2: PartialFunction[Symbol, Int] =  
  2. {case 'a => 1; case 'b => 2case 'c => 3}  
  3. scala> for(s <- List('a, 'b, 'c, 'd)){ if( f2.isDefinedAt(s) ) println( f2(s) ) }  
  4. 1 
  5. 2 
  6. 3 

用部分函數定義了f2:A=>B函數之后,就可以在適用函數前先使用isDefinedAt(x:A)方法來確定定義域

了。所謂的部分函數就是,對于反應源值域到目標值域的映射的函數f:A=>B,不一定存在對應于x<-A的f(x)。反過來如果對于任意的x<-A都存在f(x)的話,那f就稱為全函數。

Scala中方法和函數的關系

Scala即是純面向對象語言又是函數式語言,給人一種朦朧的感覺。所謂的純面向對象就是所有的語言元素都是作為對象來處理的。各個對象所持有的屬性不管是數還是字符串還是數組還是Person等實例都是對象。

因此,當然函數也是對象。實際上函數f: (ArgType1,...ArgTypeN)=>ReturnTyp是以類FunctionN[ArgType1,..., ArgTypeN, ReturnType]的實例形式被定義的。N是表示參數個數的正整數。如果是1個參數的話則是Function1[ArgType1, ReturnType]。

  1. def double(n:Int):Int = n * 2 

上述函數基本上與下述定義是等同的。

  1. object double extends Function1[Int, Int] {  
  2. def apply(n: Int): Int = n * 2 
  3. }  
  4. scala> double(10)  
  5. res1: Int = 20 

那么各個對象的方法也可以稱得上對象嗎?作為測試,試著將MyFunctions對象的方法綁定于變量。

  1. scala> val f1 = MyFunctions.foo  
  2. :8: error: missing arguments for method foo in object MyFunctions;  
  3. follow this method with `_' if you want to treat it as a partially applied funct  
  4. ion  
  5. val f1 = MyFunctions.foo  

看來光是方法原樣是不能作為函數對象來處理的。實際上只要將方法簡單地轉換一下就可以作為對象來使用了。在方法名后空一格加上“_”就可以了。

  1. scala> val f1 = MyFunctions.foo _  
  2. f1: (String, Int) => Int =   
  3. scala> f1("abcde"3)  
  4. res13: Int = 15 

這樣處理之后,我們就可以明白對象的方法也可以像屬性一樣作為對象來統一處理了。Scala語言在這一點上可以說比Smalltalk那種純面向對象語言還貫徹了面向對象的思想。

高階函數和延遲評估參數

因為Scala的函數是對象,所以不要做什么特殊處理只要將他作為參數傳給別的函數就自然而然地成為使用高階函數了。函數將別的函數作為參數來使用,所以稱之為高階函數。這時被傳遞的函數就稱為閉包。

用于List統一操作的函數群就是高階函數的典型例。下面的foreach函數,接受了以()或{}形式定義的閉包作為參數,然后將其逐一適用于接受者列表的所有元素。

  1. scala> val list = List("Scala""is""functional""language")  
  2. list: List[java.lang.String] = List(Scala, is, functional, language)  
  3. scala> list.foreach { e => println(e) }  
  4. Scala  
  5. is  
  6. functional  
  7. language  

對于同一列表list適用map函數后,對于列表list的所有元素適用s => s + “!”函數后將適用結果以列表的形式返回。這里用空格代替了調用方法的“.”,然后用( _ + “!”)替代(s => s + “!”)也是可以的。

  1. scala> list map(s => s + "!")  
  2. res15: List[java.lang.String] = List(Scala!, is!, functional!, language!)  
  3. scala> list map( _ + "!")  
  4. res16: List[java.lang.String] = List(Scala!, is!, functional!, language!)  

進一步,Scala中除了有f1(p1:T1)這種通常的“基于值的參數傳遞(by value parameter)”,還有表示為f2(p2 => T2)的“基于名稱的參數傳遞(by name parameter)”,后者用于參數的延時評估。將這個結構和高階函數相混合后,就可以簡單地定義新的語言控制結構了。下面是新語言結構MyWhile的定義和使用例。

  1. def MyWhile (p: => Boolean) (s: => Unit) {  
  2. if (p) { s ; MyWhile( p )( s ) }  
  3. }  
  4. scala> var i: Int = 0 
  5. i: Int = 0 
  6. scala> MyWhile(i < 3) {i=i+1; print("World ") }  
  7. World World World  
  8. scala> MyWhile(true) {print(“World is unlimited”) }  
  9. 無限循環  

像這樣充分利用了函數式語言的特點之后,我們會驚奇地發現像定義DSL(特定領域語言)那樣進行語言的擴展是多么的容易和自由。

模式匹配

Scala的case語句非常強大,可以處理任何類型的對象。mach{}內部列出了case 模式 => 語句。為了確保覆蓋性可以在末尾加上 _。

  1. scala> val value: Any = "string" 
  2. value: Any = string  
  3. scala> value match {  
  4. case null => println("null!")  
  5. case i: Int => println("Int: " + i)  
  6. case s: String => println("String: " + s)  
  7. case _ => println("Others")  
  8. | }  
  9. String: string  

這次匹配一下Person類的對象。

  1. scala> class Person(name:String)  
  2. defined class Person  
  3. scala> val value : Any = new Person("Zhang Fei")  
  4. value: Any = Person@e90097 
  5. scala> value match {  
  6. case null => println("null!")  
  7. case i: Int => println("Int: " + i)  
  8. case s: String => println("String: " + s)  
  9. case _ => println("Others")  
  10. | }  
  11. Others  

Case類

在Scala中模式匹配的不僅是對象,對象的屬性和類型等也可以作為模式來匹配。

例如,假設想匹配Person類,一般情況下最多就是指定“_ : Person”來匹配屬于Person類的對象了。

  1. scala> val value : Any = new Person("Zhang Fei")  
  2. value: Any = Person@1e3c2c6 
  3. scala> value match {  
  4. case _ : Person => println("person: who")  
  5. case _ => println("others: what")  
  6. | }  
  7. person: who  

不過如果使用了Case類之后,對象內的公有屬性變得也可以匹配了。定義類時只要把“class”換成“case class”之后,編譯器就會自動定義和生成同名的單例對象。并且在該單例對象中自動定義了返回該類實例的apply方法,以及返回以構造函數的參數為參數的Some類型(范型)對象的unapply(或unapplySeq)方法。并且,還自動定義了equals、hashCode和toString方法。

定義apply方法的效果是,只要定義好某個Case類之后,就可以用“類名(參數列表)”的形式來創建對象了。定義unapply方法后的效果是,可以在case語句中以Case類的構造函數的參數(對象屬性)來作為匹配目標了。

  1. scala> case class Person(name:String) //定義Case類Person  
  2. defined class Person  
  3. scala> val value : Any = Person("Zhang Fei"//不用new就可以創建對象  
  4. value: Any = Person(Zhang Fei)  
  5. scala> value match {  
  6. case Person(ns) => println("person:" + ns) //可以將Person的屬性作為匹配目標  
  7. case _ => println("others: what")  
  8. | }  
  9. person:Zhang Fei //Person的屬性name將會被抽取出來  

下面是將將整數N(v)、Add(l, r)和Mult(l, r)組合后來變現四則運算Term。由于是以case形式定義的類,請注意一下在創建Term對象時,不用new就可以直接調用N(5)、Add(…)、Mult(…)實現了。如此使用Scala的模式匹配功能后就可以很方便地實現對象的解析工作了。

  1. abstract class Term  
  2. case class N (v :Int) extends Term  
  3. case class Add(l :Term, r :Term) extends Term  
  4. case class Mult(l :Term, r :Term) extends Term  
  5. def eval(t :Term) :Int = t match {  
  6. case N (v) => v  
  7. case Add(l, r) => eval(l) + eval(r)  
  8. case Mult(l, r) => eval(l) * eval(r)  
  9. }  
  10. scala> eval(Mult(N (5), Add(N (3), N (4))))  
  11. res7:Int = 35 // 5 * (3 + 4)  

附帶說一下,上述的Term類可以認為是作為N、Add和Mult類的抽象數據類型來定義的。

將模式匹配與for語句組合

下面就看一下將模式匹配與for語句組合在一起的技巧。

  1. scala> val list = List((1"a"), (2"b"), (3"c"), (1"z"), (1"a"))  
  2. list: List[(Int, java.lang.String)] = List((1,a), (2,b), (3,c), (1,z), (1,a)) 

這時在<-前面寫的是像(1, x)一樣的模板。

  1. scala> for( (1, x) <- list ) yield (1, x)  
  2. res6: List[(Int, java.lang.String)] = List((1,a), (1,z), (1,a)) 

而且非常令人驚奇的是<-前面沒有變量也是可以的。在<-之前寫上(1, “a”)之后,for語句也可以正常地循環并且正確地返回了兩個元素。

  1. scala> for( (1"a") <- list ) yield (1"a")  
  2. res7: List[(Int, java.lang.String)] = List((1,a), (1,a)) 

還有在使用Option[T]類來避免判斷null的情況下,傳入List[Option[T]]類型的列表時,不用顯示的判斷是否是Some還是None就可以一下子返回正確的結果了。

  1. scala> val list = List(Some(1), None, Some(3), None, Some(5))  
  2. list: List[Option[Int]] = List(Some(1), None, Some(3), None, Some(5))  
  3. scala> for(Some(v) <- list) println(v)  
  4. 1 
  5. 3 
  6. 5 

接著用以下的例子看一下組合模式匹配和for語句之后所產生的威力。

  1. scala> val list = List(1"two", Some(3), 4"five"6.07)  
  2. list: List[Any] = List(1, two, Some(3), 4, five, 6.07

對上述例表中的元素對象類型進行判別后再分類一下吧。模式匹配里不僅可以使用值來作為模式,從下例可知模式還具有對Some(x)形式中的x也起作用的靈活性。

  1. for(x <- list){ x match{  
  2. case x:Int => println("integer " + x)  
  3. case x:String => println("string " + x)  
  4. case Some(x) => println("some " + x)  
  5. case _ => println("else " + x)  
  6. } }  
  7. scala> for(x <- list){ x match{  
  8. case x:Int => println("integer " + x)  
  9. case x:String => println("string " + x)  
  10. case Some(x) => println("some " + x)  
  11. case _ => println("else " + x)  
  12. | } }  
  13. integer 1 
  14. string two  
  15. some 3 
  16. integer 4 
  17. string five  
  18. else 6.0 
  19. integer 7 

結束語

看了本文之后大家覺得怎么樣呀?應該享受了Scala所具備的,將面向對象式和函數式語言功能充分融合的能力,以及高階函數和模式匹配功能了吧。

Scala語法的初步介紹就到本講為止了,接下來的講座將介紹一下Scala語言更深入的部分。包括隱式轉換、范型和單子等有趣的話題。

【編輯推薦】

  1. Scala講座:面向對象和函數式的特點總結
  2. Scala講座:函數式編程處理樹結構數據
  3. Scala講座:編程的思考方法
  4. Scala講座:將函數作為第一類對象來處理
  5. Scala講座:全局變量問題的解決
責任編輯:book05 來源: JavaEye博客
相關推薦

2009-09-27 15:29:00

Scala講座面向對象Scala

2009-09-27 15:23:00

Scala講座函數式編程Scala

2009-12-11 10:42:00

Scala講座類定義構造函數

2009-09-24 09:41:00

Scala講座Scala

2009-12-11 10:43:00

Scala講座操作符函數

2010-01-28 14:51:24

Scala后函數式

2009-09-24 09:28:00

Scala講座全局變量scala

2010-03-11 10:34:22

Scala

2009-12-11 10:45:00

Scala講座類型系統功能

2009-07-21 17:16:34

Scala函數式指令式

2009-07-08 12:43:59

Scala ServlScala語言

2009-09-24 09:38:00

Scala講座第一類對象scala

2020-10-31 17:33:18

Scala語言函數

2009-07-08 16:10:24

Scala簡介面向對象函數式

2009-12-11 10:43:00

Scala講座混入多重繼承類型層次

2009-06-09 13:18:56

Scala函數式命令式

2009-07-09 00:25:00

Scala函數式

2009-07-22 07:42:00

Scala偏應用函數

2009-06-26 14:42:08

2009-07-22 07:57:00

ScalaCurry化函數
點贊
收藏

51CTO技術棧公眾號

久久av免费观看| 久久久999国产精品| 国产91对白刺激露脸在线观看| 开心激情综合网| 麻豆91精品| 最新国产精品拍自在线播放| 波多野结衣电影免费观看| 2019中文字幕在线电影免费| 久久综合资源网| 成人免费直播live| 国产午夜性春猛交ⅹxxx| 综合国产视频| 日韩一级片在线观看| 久久无码高潮喷水| 在线看三级电影| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲一区二区三区777| 在线能看的av| 亚洲午夜精品久久久久久app| 国产香蕉一区二区三区在线视频 | 欧美精品一区二区三区在线四季| 91丨九色丨蝌蚪丨对白| 国产精品久久久免费| 久久精品影视伊人网| 日韩人妻一区二区三区| 亚洲精品高潮| 欧美精品一级二级三级| 亚洲熟妇av一区二区三区| 免费在线看电影| 综合在线观看色| 日韩在线电影一区| 亚洲av无码乱码在线观看性色| 麻豆国产91在线播放| 欧美福利视频网站| 老熟妻内射精品一区| 精品午夜久久| 亚洲欧洲视频在线| 国产高清自拍视频| 国产成人在线中文字幕| 日韩欧美一级在线播放| 久久久久久久久久一区二区| 国产经典一区| 色欧美片视频在线观看在线视频| 日本十八禁视频无遮挡| 91福利在线尤物| 亚洲一本大道在线| 成人在线国产视频| 国产网红在线观看| 亚洲午夜av在线| 久久精品无码中文字幕| 欧美wwww| 亚洲成人av福利| 国产va亚洲va在线va| 国产嫩草在线视频| 亚洲五月六月丁香激情| 黄色国产一级视频| 这里有精品可以观看| 日韩欧美国产网站| 韩国日本美国免费毛片| 韩国成人在线| 欧美性高清videossexo| jizz18女人| 成人在线视频www| 欧美一级艳片视频免费观看| 国产成人精品一区| 国产69精品久久久久久久久久| 日韩一级大片| 啪一啪鲁一鲁2019在线视频| 手机在线看片1024| 丝袜a∨在线一区二区三区不卡| 日本一区二区不卡| 久草视频在线免费| 精品亚洲国内自在自线福利| 亚洲一区二区中文| 日韩专区第一页| 26uuu国产电影一区二区| 日本精品一区二区三区视频 | 久久久精品国产| 欧美黄色免费看| 国产无遮挡裸体免费久久| 亚洲国产精品成人精品| 亚洲国产天堂av| 婷婷亚洲五月色综合| 久久99久久99精品免观看粉嫩 | 右手影院亚洲欧美| 欧美精品一二| 欧美精品在线第一页| 色播视频在线播放| 美国毛片一区二区三区| 99中文字幕| 欧美日韩国产中文字幕在线| 国产精品久久精品日日| 国产私拍一区| 国产日本在线| 一区二区三区小说| 久久久久久久中文| 欧美aaaaaa| 亚洲精品在线观| 国内精品卡一卡二卡三| 欧美黄色一区| 日本精品久久中文字幕佐佐木| 91av久久久| 91视频观看视频| 中文字幕一区二区三区最新| 96av在线| 91精品久久久久久久久99蜜臂| 99久久人妻无码中文字幕系列| 成人在线国产| 91av视频导航| 99久久精品免费看国产交换| 青青草精品视频| 99久久免费国| 在线观看美女网站大全免费| 亚洲午夜一区二区| 国产精品一区二区小说| 日韩mv欧美mv国产网站| 久久国产精品影片| 波多野结衣mp4| av亚洲精华国产精华精| 国产精品久久7| 亚洲免费视频一区二区三区| 精品女同一区二区三区在线播放 | 视频91a欧美| 亚洲欧美日本另类| 日韩精品视频免费看| 九一久久久久久| 国产精品对白刺激久久久| av在线中文| 狠狠色狠狠色综合日日小说| wwwxxx色| 66久久国产| 国产精品日韩久久久久| 日韩美女一级视频| 性久久久久久久久| avtt中文字幕| 亚洲欧美偷拍自拍| 91精品久久久久久久久久久久久久 | av毛片在线免费看| 欧美日韩一区二区三区在线| 无码h肉动漫在线观看| 在线日韩电影| 国产成人成网站在线播放青青| 成人video亚洲精品| 欧美高清精品3d| 色欲狠狠躁天天躁无码中文字幕 | 国产片一区二区| 国产a级一级片| 日韩人体视频| 欧美一级片在线播放| 欧美熟妇另类久久久久久不卡 | 青青草原国产免费| 日韩城人网站| www.久久色.com| 夜夜狠狠擅视频| 国产精品无人区| 污污网站免费观看| 亚洲色图网站| 亚洲综合av影视| 性欧美video高清bbw| 欧美大片拔萝卜| 欧美人与禽zozzo禽性配| 国产成人亚洲综合a∨婷婷图片| 天天做天天爱天天高潮| 日韩欧美中文在线观看| 欧美极品少妇全裸体| 亚洲AV无码乱码国产精品牛牛| 亚洲午夜在线电影| 性色av蜜臀av色欲av| 亚洲制服av| 免费看成人av| 视频精品导航| 久热精品视频在线观看| 国产av精国产传媒| 亚洲福利视频一区二区| 老司机福利av| 蜜臀av性久久久久蜜臀aⅴ四虎 | 高清乱码免费看污| 九九在线高清精品视频| 日本欧美国产在线| 阿v免费在线观看| 欧美日韩免费不卡视频一区二区三区 | 爱福利在线视频| 亚洲国产天堂久久综合| 九九精品免费视频| 国产片一区二区| 人妻换人妻仑乱| 99精品国产一区二区青青牛奶| 欧美二级三级| 国产精品久一| 国产91精品高潮白浆喷水| 91看片在线观看| 日韩欧美二区三区| 中文字幕一区二区人妻视频| 亚洲欧美成人一区二区三区| 中文文字幕文字幕高清| 美女一区二区久久| 免费成人午夜视频| 99精品视频在线| 九九九热999| 15—17女人毛片| 亚洲三级性片| 川上优av一区二区线观看| 国产精选在线| 日韩视频免费看| 午夜视频www| 欧美人成免费网站| 欧美a∨亚洲欧美亚洲| 综合激情成人伊人| 色无极影院亚洲| 国产成人精品免费网站| 在线免费观看av的网站| 亚洲激情av| 日本美女爱爱视频| 欧美日韩精品一区二区视频| 国产综合18久久久久久| 91嫩草国产线观看亚洲一区二区| 热99在线视频| 91福利在线尤物| 欧美男插女视频| 色综合久久久久综合一本到桃花网| 亚洲护士老师的毛茸茸最新章节| 国产视频一区二区三| 欧美丝袜丝nylons| 日本黄色一级视频| 黑人狂躁日本妞一区二区三区 | 亚洲国产精品影院| 国产福利视频网站| 中文字幕精品综合| 90岁老太婆乱淫| www.视频一区| www.日韩欧美| 国产精品无码白浆高潮| 日本大香伊一区二区三区| 日韩免费观看一区二区| 亚洲激情在线播放| 黄色香蕉视频在线观看| 国产精品免费视频网站| 一道本在线观看| 91在线国内视频| 成熟妇人a片免费看网站| 国产精品一区二区免费不卡| 久久国产激情视频| 另类专区欧美蜜桃臀第一页| 亚洲性生活网站| 久久久久国产精品午夜一区| 国内外成人免费激情视频| 亚洲美女黄网| 免费在线观看视频a| 精品电影一区| 国产妇女馒头高清泬20p多| 亚洲美女少妇无套啪啪呻吟| 91九色在线观看视频| 日韩天天综合| 18禁男女爽爽爽午夜网站免费| 亚洲一区久久| 女人天堂av手机在线| 免费看的黄色欧美网站| 国产91美女视频| 老司机一区二区三区| 久久九九国产视频| 免费精品视频在线| 韩国日本美国免费毛片| 美女在线视频一区| 精品人妻一区二区三区免费| 国产宾馆实践打屁股91| 国产精品久久久久久在线观看| 99这里只有久久精品视频| 国产夫妻性爱视频| 中文成人av在线| 国语对白在线播放| 亚洲电影激情视频网站| 国产精品视频一区在线观看| 91久久线看在观草草青青| 最近中文字幕在线视频| 91精品中文字幕一区二区三区 | 亚洲精品www久久久| 男生女生差差差的视频在线观看| 伊人久久精品视频| 高h视频在线观看| 国内成人精品视频| 日韩新的三级电影| 成人福利在线视频| 成人香蕉社区| 日韩av一级大片| 亚洲国产精品日韩专区av有中文| 国产aaa免费视频| 久久久国产精品一区二区中文| 中国黄色片免费看| 国产成人综合在线观看| 久久精品一区二区免费播放| 亚洲欧美在线视频观看| 国产91av视频| 欧美日精品一区视频| 亚洲国产精品久久久久爰性色| 亚洲奶大毛多的老太婆| 好吊日视频在线观看| 777777777亚洲妇女| 五月天色综合| 久久国产精品-国产精品| 欧美激情欧美| 日韩在线视频在线观看| 国产一区啦啦啦在线观看| 99久久国产精| 伊人婷婷欧美激情| 色老头在线视频| 精品国产乱码久久久久久图片| sese一区| 欧美一级淫片丝袜脚交| 国产一区二区三区免费观看在线 | 亚洲人午夜射精精品日韩| 久久精品国产96久久久香蕉| 欧美一级鲁丝片| 亚洲字幕一区二区| 日韩一级毛片| 女人扒开屁股爽桶30分钟| 国产成人在线网站| 久久久久人妻一区精品色| 都市激情亚洲色图| 性生交大片免费看女人按摩| 搡老女人一区二区三区视频tv| 欧美私密网站| 国产精品久久久久av福利动漫| 91一区二区| 国内自拍视频一区| 91麻豆蜜桃一区二区三区| 免费人成视频在线| 777色狠狠一区二区三区| 国产高清在线看| 青草成人免费视频| 日韩av中文字幕一区| 日韩欧美不卡在线| 国产精品456露脸| 91大神福利视频| 欧美伊人久久久久久久久影院 | 亚洲毛片一区二区三区| 亚洲国产成人精品一区二区| 18+激情视频在线| 成人激情视频网| 久久性感美女视频| 亚洲黄色小视频在线观看| 久久久影视传媒| 欧美一区二区三区四| 亚洲国产精品中文| 91福利区在线观看| 精品视频一区二区| 亚洲美女黄网| 日韩片在线观看| 色综合天天综合网天天狠天天| 外国精品视频在线观看| 97视频网站入口| 久久中文字幕导航| 黄色片视频在线免费观看| 91伊人久久大香线蕉| 五月天婷婷久久| 亚洲欧美日韩一区二区在线| 激情开心成人网| 亚洲国产日韩欧美| 精品中文字幕一区二区小辣椒| 波兰性xxxxx极品hd| 337p亚洲精品色噜噜| www视频在线免费观看| 91丝袜脚交足在线播放| 亚洲一级黄色| 你懂得在线视频| 色美美综合视频| 99精品老司机免费视频| 91精品视频在线| 欧美私人啪啪vps| 亚洲va久久久噜噜噜久久狠狠 | 日本黄色免费视频| 欧美孕妇与黑人孕交| 精品一区二区三区在线| 91高清国产视频| 亚洲欧美日韩国产中文在线| 亚洲黄色在线观看视频| 国产69精品久久久久久| 国产欧美一区二区三区精品观看| 一级黄色特级片| 怡红院av一区二区三区| 婷婷在线观看视频| 国产第一区电影| 中文一区一区三区免费在线观看| 中国极品少妇xxxx| 91成人看片片| 中文在线观看免费| 久久99精品久久久久久久久久| 久久免费高清| 青青草原在线免费观看| 国产婷婷成人久久av免费高清| 欧美黄色a视频| 97视频在线免费| 欧美激情一区不卡| 亚洲国产精品无码久久| 国产成人自拍视频在线观看| 重囗味另类老妇506070| 国产高潮呻吟久久| 日韩一级片在线播放| av免费在线一区| av日韩一区二区三区| 亚洲欧洲无码一区二区三区|