2010-04-07 5 views
8
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)) 

Điều tôi muốn cho loại kết quả là Danh sách [(Int, Int, Int)]. Cách duy nhất tôi tìm thấy là:cách ngắn để breakOut đến loại bộ sưu tập cụ thể?

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)) 

Có cách nào ngắn hơn không?

Trả lời

12

Bạn có thể làm cho nó ngắn gọn hơn một chút bằng cách cho phép các thông số loại để breakOut được suy ra từ các kiểu trả về:

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)) 
6

Trong khi Ben là câu trả lời đúng, một sự thay thế có thể đã được sử dụng một loại alias:

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

Kết hợp Ben và oxbow_lakes' câu trả lời, bạn có thể nhận được một chút ngắn hơn vẫn:

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