[转帖]scala  for comprehension_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3773 | 回复: 0   主题: [转帖]scala  for comprehension        下一篇 
只是很无聊
注册用户
等级:中尉
经验:440
发帖:33
精华:0
注册:2013-6-18
状态:离线
发送短消息息给只是很无聊 加好友    发送短消息息给只是很无聊 发消息
发表于: IP:您无权察看 2013-6-20 13:50:31 | [全部帖] [楼主帖] 楼主

scala并不支持一般的for循环,取而代之的是for comprehesion。scala通过丰富
的for comprehesion特性支持各种循环结构。
要使一个类支持for comprehesion很简单,不需要继承任何trait,相应的实现
map, filter, flatMap, foreach四个方法中的一个或多个即可。下面针对每种
语法解释一下。

scala 伪代码

  1. // 语法形式           
  2. for( val p <- e ) yield ee           
  3. // 对应的函数调用 -- map           
  4. e.map( p => ee )           
  5.           
  6. // 语法形式           
  7. for( val p <- e ) ee        
  8. // 对应的函数调用 -- foreach           
  9. e.foreach {  p => ee }           
  10.           
  11. // 语法形式           
  12. for( val p <- e; val pp <- ee ) yield eee        
  13. // 对应的函数调用 -- flatMap           
  14. e.flatMap( p => for(pp <- ee ) yield eee )           
  15.           
  16. // 语法形式           
  17. for( val p <- e; val pp <- ee ) eee        
  18. // 对应的函数调用 -- foreach           
  19. e.foreach( p => for( pp <- ee ) eee )           
  20.           
  21. // 语法形式           
  22. for ( val p <- e ) if g ...           
  23. // 对应的函数调用 -- filter           
  24. p <- e.filter( ... => g )          


也就是说,任何一个类,只要实现了map方法(参数为一个函数),就可以使用 for (val v < - new class) yield v 的语法。如果再实现了filter方法,就可以使用 for(val v < - obj if guard) yield v 的语法,如果实现了flatMap方法,就可以使用复合的 for(val v1< -o1; val v2< -o2) yield o1 op o2这样的语法,如果实现了foreach方法,可以实现 for(val v< -obj){f} 的语法。

scala对for comprehension的支持是通过在编译期检查类的方法增加的,不需要象java那样显示地从Iterable方法派生,而且4个函数之中可以根据需要来实现,要灵活地多。

举几个简单的例子对比一下

scala 代码

  1. class ForIterClass {   
  2.   def map(f: int => int): List[int] = List( 1, 2, 3 )    
  3.   def foreach(f: int => Unit) = println("hello foreach")   
  4. }   
  5. for( val p <- new ForIterClass) yield p   
  6. // 等价于   
  7. (new ForIterClass) map (p => p)   
  8. for( val fc <- new ForIterClass ) println(fc)   
  9. // 等价于   
  10. (new ForIterClass) foreach (fc => println("hello foreach"))   
  11. for { i <1 until n   
  12.       j <1 until i   
  13.       if isPrime(i+j)   
  14. } yield (i, j)   
  15. // 等价于   
  16. (1 until n)   
  17.     .flatMap {   
  18.       case i => (1 until i)   
  19.         .filter { j => isPrime(i+j) }   
  20.         .map { case j => (i, j) } }   



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论