【问题标题】:short way to breakOut to specific collection type?突破特定集合类型的捷径?
【发布时间】:2011-02-05 05:28:50
【问题描述】:
scala> val m = Map(1 -> 2)
m: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

scala>  m.map{case (a, b) => (a+ 1, a+2, a+3)}
res42: scala.collection.immutable.Iterable[(Int, Int, Int)] = List((2,3,4))

我想要的结果类型是 List[(Int, Int, Int)]。我找到的唯一方法是:

scala>  m.map{case (a, b) => (a+ 1, a+2, a+3)}(breakOut[Map[_,_], (Int, Int, Int), List[(Int, Int, Int)]])
res43: List[(Int, Int, Int)] = List((2,3,4))

有没有更短的方法?

【问题讨论】:

    标签: scala scala-2.8 scala-collections


    【解决方案1】:

    您可以通过从返回类型推断breakOut 的类型参数来使其更简洁:

    scala>  m.map{case (a, b) => (a+1, a+2, a+3)}(breakOut) : List[(Int, Int, Int)]
    res3: List[(Int, Int, Int)] = List((2,3,4))
    

    【讨论】:

      【解决方案2】:

      虽然 Ben 的答案是正确的,但另一种选择是使用 类型别名

      type I3 = (Int, Int, Int)
      m.map{case (a, b) => (a+ 1, a+2, a+3)}(breakOut[Map[_,_], I3, List[I3]])
      

      【讨论】:

        【解决方案3】:

        结合 Ben 和 oxbow_lakes 的答案,您可以得到更短的答案:

        type I3 = (Int, Int, Int)
        m.map {case (a, b) ⇒ (a+1, a+2, a+3)}(breakOut): List[I3]
        

        【讨论】:

          猜你喜欢
          • 2011-11-18
          • 2011-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-24
          相关资源
          最近更新 更多