美文网首页
for-comprehensions(gold_axe)

for-comprehensions(gold_axe)

作者: 胖达_4b7e | 来源:发表于2019-05-22 16:08 被阅读0次

for-comprehensions 是最终会编译成 mapflatMap的语法糖
如果一个类 有实现def map[B](f: A => B): 类名[B] 这个map方法
就可以用一行的for表达式表示这个map方法的调用, 如

sealed trait Option[+A] {
  def map[B](f: A => B): Option[B] = {
    this match {
      case None=>None
      case Some(a)=>Some(f(a))
    }
  }
//其他方法
}

就可以这样用

 for {
      a1  <- Some(a)
 } yield  f(a1)
// f是某A=>B的函数

会被编译成
Some(a).map(a1=>f(a1)) 返回值是 Option[B]

如果同时实现了 方法 def map[B](f: A => B): 类名[B]def flatMap[B](f: A => 类名[B]): 类名[B]
如Option

sealed trait Option[+A] {
  def map[B](f: A => B): Option[B] = {
    this match {
      case None=>None
      case Some(a)=>Some(f(a))
    }
  }

  def flatMap[B](f: A => Option[B]): Option[B] = {
    this match {
      case None=>None
      case Some(a)=>f(a)
    }
  }
//其他方法
}

就可以这样, 用多行绑定的for表达式

 def map2[A,B,C](a: Option[A], b: Option[B])(f: (A, B) => C): Option[C] ={
    for{
      p1<- a
      p2<- b
    }yield{
      f(p1,p2)
    }
  

里面这个for表达式会被编译成a.flatMap(aa => b map (bb => f(aa, bb)))

再比如 Either

sealed trait Either[+E,+A] {
 def map[B](f: A => B): Either[E, B] = 
     this match {
       case Right(a) => Right(f(a))
       case Left(e) => Left(e)
     }

  def flatMap[EE >: E, B](f: A => Either[EE, B]): Either[EE, B] =
    this match {
      case Left(e) => Left(e)
      case Right(a) => f(a)
     }
// 其他函数
}

可以这样用

for {
  age <- Right(42)
  name <- Left("invalid name")
  salary <- Right(1000000.0)
} yield employee(name, age, salary)

返回值类型是 Either[String,Employee], 如果其他行也有Left 并且是其他类型的E, String 可以提示类型到Any

相关文章

  • for-comprehensions(gold_axe)

    for-comprehensions 是最终会编译成 map 和flatMap的语法糖如果一个类 有实现def m...

  • activiti(gold_axe)

    构成 主要就是2部分 1.xml解析器解析标准流程图 加上 一些 actviti 自定义的标签和属性图是这样 文本...

  • ThreadLocal(gold_axe)

    ThreadLocalMap是Thread里面一个以ThreadLocal为key的map, 因为一个线程可能有多...

  • ConcurrentHashMap(gold_axe)

    构造 指定初始容量 1.8有变化 比如设的32 是 32+32/2+1 向上取2的次方所有 设32 得 64...

  • volatile(gold_axe)

    用于修饰 要被多线程共享, 却不是final, 是可变 的 fieldJIT编译器看到这个volatile 关键字...

  • 内存屏障(gold_axe)

    https://book.douban.com/subject/27034721/[https://book.do...

  • 0 mq(gold_axe)

    各种消息中间件 都支持消息持久化,但是都有性能损耗协议AMQP: rabitmq就是为AMQP而生的,Active...

  • 有序性(gold_axe)

    重排序概念 是一种优化不影响单线程程序正确性的情况下,提升性能为了性能, 物理上不能被禁止, 只能被逻辑上部分禁止...

  • 高速缓存(gold_axe)

    https://book.douban.com/subject/27034721/ 每个cpu都有各自的高速缓存相...

  • 13.3.5 偏向锁(gold_axe)

    因此, 对象产生以后, 头上就是红框里面这个样子,就是 线程ID没有 顺利 无竞争 首次 有线程试图获得这个对象的...

网友评论

      本文标题:for-comprehensions(gold_axe)

      本文链接:https://www.haomeiwen.com/subject/thruzqtx.html