如何在scala中平坦地展平?

时间:2017-05-29 15:58:29

标签: scala

我正在使用scala尝试一些基本逻辑。我尝试了下面的代码,但它会引发错误。

scala> val data = ("HI",List("HELLO","ARE"))
data: (String, List[String]) = (HI,List(HELLO, ARE))

 scala> data.flatmap( elem => elem)
  <console>:22: error: value flatmap is not a member of (String, List[String])
          data.flatmap( elem => elem)

预期产出:

(HI,HELLO,ARE)

有人可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:4)

你正在尝试对一个无法工作的元组进行flatMap。以下内容适用:

val data = List(List("HI"),List("HELLO","ARE"))

val a = data.flatMap(x => x)

答案 1 :(得分:2)

这在scala中非常简单:

val data = ("HI",List("HELLO","ARE"))
println( data._1 :: data._2 )

您正在使用哪种确切的数据结构?

如果您清楚自己的数据结构:

type rec = (String, List[String])

val data : rec = ("HI",List("HELLO","ARE"))

val f = ( v: (String, List[String]) ) => v._1 :: v._2

f(data)

答案 2 :(得分:2)

有几点意见:

  1. 目前,元组没有flatten方法(除非您使用shapeless)。

  2. flatMap无法直接应用于元素和集合混合的元素列表。

  3. 在您的情况下,您可以将元素“HI”作为List

    的一部分
    val data = List(List("HI"), List("HELLO","ARE"))
    
    data.flatMap(identity)
    

    或者,您可以定义一个函数来相应地处理混合元素类型:

    val data = List("HI", List("HELLO","ARE"))
    
    def flatten(l: List[Any]): List[Any] = l.flatMap{
      case x: List[_] => flatten(x)
      case x => List(x)
    }
    
    flatten(data)
    

答案 3 :(得分:1)

如果这就是你想要的:

val data = ("HI",List("HELLO,","ARE").mkString(""))
println(data)

>>(HI,HELLO,ARE)

答案 4 :(得分:1)

您正试图flatMap Tuple2 current api <{1}}中没有extract

如果您不想更改输入,可以Tuple2 val data = ("HI",List("HELLO","ARE")) val output = (data._1, data._2(0), data._2(1)) println(output) 中的值并提取第二元组值的值,如下所示

func get365AcessToken() -> String {
        let clientId = "bb5e40e8-1fcc-XXXXXXXXX"
        let redirectUrl = "XXXXXXXXX-1fcc-47ac-b339-571a52d0f862://auth"

        let authContext = ADAuthenticationContext.init(authority: "https://login.microsoftonline.com/common", error: nil)
        authContext.acquireTokenWithResource("https://graph.windows.net", clientId: clientId, redirectUri: NSURL.init(string: redirectUrl)) { (result) in
            print(result)
            print(result.error.errorDetails)
            print(result.accessToken)
        }
        authContext.parentController = self

        return ""
    }