2011-11-26 26 views
5
ghi các sự kiện (phân tích) thư viện

Một Java có một phương pháp mà phải mất một tên sự kiện và sau đó varargs danh sách các Strings như thế này:cầu dẹt một bản đồ để varargs Chuỗi danh sách trong Scala

Analytics.event("my event name", "key1", "value1", "key2", "value2" ...) 

tôi đã thu thập sự kiện của tôi tham số trong một Bản đồ như

Map("key1" -> "value1", "key2" -> "value2" ...) 

Bây giờ có phải là một cách để san bằng Map để liệt kê nơi khóa và giá trị thay thế và sau đó ăn nó vào phương pháp sự kiện. Tôi đã có một số dự đoán, như chuyển các Map để liệt kê một List của Tuple s, nhưng gọi .flatten trên nói rằng

No implicit view available from (java.lang.String, java.lang.String) => scala.collection.TraversableOnce[B] 

tôi đang thiếu gì ở đây?

Trả lời

6

Bạn có thể sử dụng : _* điều hành:

def event(name: String, values: String*) {/*...*/} 

val params = Map("key1" -> "value1", "key2" -> "value2") 
val paramsArr = params flatMap {case(k, v) => List(k, v)} toArray 

event("name", paramsArr: _*) 

Không chắc liệu điều này làm việc với Java varargs là tốt (cho chúng tôi biết!)

+0

Cảm ơn bạn! Hoạt động chính xác như được cho là. Các toArray (hoặc toSeq) cuối cùng là cần thiết trước khi: _ * để làm cho nó theo định dạng được yêu cầu bởi các varargs java. – vertti

6

Bạn có thể sử dụng flatMap để ánh xạ mọi cặp khóa/giá trị vào danh sách có hai phần tử và sau đó nối các danh sách này.

scala> Map("k1" -> "v1", "k2" -> "v2") 
res0: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(k1 -> v1, k2 -> v2) 

scala> res0.flatMap { case (k,v) => k::v::Nil } 
res1: scala.collection.immutable.Iterable[java.lang.String] = List(k1, v1, k2, v2) 

Khi bạn có điều đó, bạn chỉ có thể vượt qua danh sách để các Phương thức sự kiện:

Analytics.event("my event name", res1:_*) 
+0

Cảm ơn. res: _ * sẽ tạo ra Iterable và Intellij nói với tôi rằng đó là Seq được yêu cầu ở đây. – vertti

1
val m = Map ("key1" -> "value1", "key2" -> "value2", "k3"-> "v3") 
val li = m.map ((e)=> List (e._1, e._2)).flatten.toSeq 
event ("name", li: _*) 
+0

Khá giống với câu trả lời của tôi, nhưng 1 giờ sau đó và sử dụng bản đồ và flatten thay vì flatMap. Vấn đề ở đây là gì? –

+0

Tôi quên để quay trở lại. Vì nó sử dụng một cú pháp khác, tôi giữ nó trực tuyến. Một lý do để bỏ phiếu nó xuống? –