【问题标题】:Maps and Flatmaps in ScalaScala 中的地图和平面地图
【发布时间】:2018-08-17 02:49:10
【问题描述】:

我是 scala 的新手。在使用带有元组的地图和平面地图方面,我需要很多帮助。

我的功能如下-

    def extract(url: String): String = {//some code}
    def splitstring(content: String): Array[String]={//some code}
    def SentenceDetect(paragraph: Array[String]): Array[String] = {//some code}
    def getMd5(literal: String): String = {//some code}

我有一个传入的 url 列表。我希望它使用地图和平面地图来完成上述一系列功能。

    var extracted_content=url_list.map(url => (url,extract(url)))

    val trimmed_content=extracted_content.map(t => (t._1,splitstring(t._2)))

    val sentences=trimmed_content.map(t => (t._1,SentenceDetect(t._2)))

    val hashed_values=sentences.flatMap(t => (t._1,getMd5(t._2)))

问题是我在 flatMap 上遇到错误,因为类型不匹配--

Error:(68, 46) type mismatch;
  found   : (String, String)
  required: scala.collection.GenTraversableOnce[?]
val hashed_values=sentences.flatMap(t => (t._1,getMd5(t._2.toString)))

如何完成。

【问题讨论】:

    标签: scala


    【解决方案1】:

    我想这就是你所追求的。

    val hashed_values = sentences.map(t => (t._1, t._2.map(getMd5)))
    

    这应该导致类型List[(String,Array[String])]。这假设您实际上想要对 t._2 数组中的每个元素进行 Md5 计算。

    回想flatMap() 的签名是flatMap(f: (A) ⇒ GenTraversableOnce[B]),换句话说,它接受一个函数,该函数接受一个元素并返回一个过渡元素的集合。一个元组 (String,String) 不是 GenTraversableOnce 因此你得到的错误。

    【讨论】:

    • 谢谢,我正是想要这个。
    【解决方案2】:

    您收到此错误是因为 getMd5(...) 接受一个字符串,但 sentencesList[(String, Array[String])] 类型(假设 url_listList[String]),所以 t._2Array[String] 类型。

    无论如何,关于您的代码的一些注意事项:

    1. scala 中的变量名称是“lower camel” (https://docs.scala-lang.org/style/naming-conventions.html),而不是带下划线的 lower
    2. extracted_content 应该是 val
    3. 因为你所有的变量都是映射,而且你想转换映射的值,你最好使用.mapValues而不是.map

    【讨论】:

    • 据我所知,参数不是问题。我试图改变这一点。没有帮助。它必须与 flatMap 接受的上下文有关。另外,感谢您的额外说明。我相应地编辑了我的代码。
    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多