加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么不scala.util.Try实现GenTraversableOnce?

发布时间:2020-12-16 09:11:06 所属栏目:安全 来源:网络整理
导读:感谢Martin Odersky在Coursera上的最新产品,我已经开始玩 scala.util.Try了.然而,我惊讶地发现,它不一定很好地收集monads,因为它不实现scala.collection.GetTraversableOnce. 这可能会派上用场.例如,您可以将字符串列表转换为整数,同时抛出不良的列表: def
感谢Martin Odersky在Coursera上的最新产品,我已经开始玩 scala.util.Try了.然而,我惊讶地发现,它不一定很好地收集monads,因为它不实现scala.collection.GetTraversableOnce.

这可能会派上用场.例如,您可以将字符串列表转换为整数,同时抛出不良的列表:

def ints(strs:List[String]):List[Int] = strs.flatMap(s => Try(s.toInt))

解决方法很简单.只需将Try转换为Option,让其隐式转换适用于我们:

def ints(strs:List[String]):List[Int] = strs.flatMap(s => Try(s.toInt).toOption)

似乎Try,Try会实现GenTraversableOnce或者有自己的隐式转换.任何人都可以解释为什么不这样做?这只是事实吗,实际上并不是一个monad?

解决方法

这是一个Monad,但在我看来,它真的不是你试图使用它的方式. FlatMap不用于在不同的单元之间进行转换(M [A] => M [B],是但不是M [A] => N [B]或甚至M [A] => N [A] .感觉更像是你想要的东西:

import scala.util.{Try,Success}

def ints2(strs: List[String]): List[Int] =
  strs.map { s => Try(s.toInt) }.collect { case Success(n) => n }

要么

import scala.util.{Try,Success,Failure}

def ints3(strs: List[String]): List[Int] = strs.flatMap { s =>
    Try(s.toInt) match {
        case Success(n) => List(n)
        case Failure(ex) => List.empty
    }
}

=>

scala> ints2(List("1","2","a","3"))
res8: List[Int] = List(1,2,3)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读