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

scala – 为什么我不能flatMap一试?

发布时间:2020-12-16 19:09:20 所属栏目:安全 来源:网络整理
导读:特定 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(numberO
特定

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?
>应该包括在结果中吗?那么它将是List(1,异常,2).这里的问题是类型是List [Any],因为你必须为Int和Throwable找到一个常见的超级类.你失去了类型.

这些应该是为什么没有隐式转换.当然,如果您接受上述后果,您可以自由定义一个.

(编辑:李大同)

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

    推荐文章
      热点阅读