scala – 为什么我不能flatMap一试?
特定
val strings = Set("Hi","there","friend") def numberOfCharsDiv2(s: String) = scala.util.Try { if (s.length % 2 == 0) s.length / 2 else throw new RuntimeException("grr") } 为什么我不能flatMap离开方法调用的尝试?即 strings.flatMap(numberOfCharsDiv2) <console>:10: error: type mismatch; found : scala.util.Try[Int] required: scala.collection.GenTraversableOnce[?] strings.flatMap(numberOfCharsDiv2) 要么 for { s <- strings n <- numberOfCharsDiv2(s) } yield n <console>:12: error: type mismatch; found : scala.util.Try[Int] required: scala.collection.GenTraversableOnce[?] n <- numberOfCharsDiv2(s) 但是如果我使用选项而不是尝试没有问题. def numberOfCharsDiv2(s: String) = if (s.length % 2 == 0) Some(s.length / 2) else None strings.flatMap(numberOfCharsDiv2) # => Set(1,3) 试用后不允许flatMap的理由是什么? 解决方法
我们来看看flatMap的签名.
def flatMap[B](f: (A) => GenTraversableOnce[B]): Set[B] 你的numberOfCharsDiv2被看作是String =>尝试[INT].尝试不是GenTraversableOnce的子类,这就是为什么你得到错误.您不要严格需要一个赋予集的功能,只因为您在Set上使用flatMap.该功能基本上必须返回任何类型的集合. 那么为什么它可以与Option配合使用?选项也不是GenTraversableOnce的子类,但是在Option companion对象中存在隐式转换,将其转换为List. implicit def option2Iterable[A](xo: Option[A]): Iterable[A] = xo.toList 那么还有一个问题.为什么没有Try的隐式转换?因为你可能不会得到你想要的. flatMap可以看作是一个贴图,然后是平坦的. 想象你有一个List [Option [Int]]像List(Some(1),None,Some(2)).然后flatten会给你List(1,2)类型List [Int]. 现在看一下Try的例子. List [Try [Int]]类型的列表(成功(1),失败(异常),成功(2)). 现在如何平坦化工作与失败? 它应该像没有消失吗?那么为什么不直接使用Option? 这些应该是为什么没有隐式转换.当然,如果您接受上述后果,您可以自由定义一个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |