开发者

Scala: What is the idiomatic syntax for transforming nested collections?

开发者 https://www.devze.com 2023-01-06 11:03 出处:网络
For example: I have a list开发者_如何学运维 of Maps and I\'d like to create a List from the values of the 3rd \"column\" of the maps...

For example: I have a list开发者_如何学运维 of Maps and I'd like to create a List from the values of the 3rd "column" of the maps...

val l = List(Map(1 -> "test", 2 -> "test", 3 -> "test"), Map(4 -> "test", 5 -> "test", 6 -> "test"))


Well, there's no ordering on maps, so the "third column" part of your question doesn't really make sense. If you mean something like "return a list of values that have map key 3"), they you could do

    val l = List(Map(1 -> "test1", 2 -> "test2", 3 -> "test3"), Map(1 -> "test4", 2 -> "test5", 3 -> "test6"))

    val thirdArgs= for(map<-l; value <-map.get(3)) yield value
   // or equivalently val thirdArgs= l.flatMap(_.get(3))

    println(thirdArgs)// prints List(test3, test6)

This relies on the fact that map.get(3) returns an Option[String], and the Scala for-comprehension syntax works with Option.

If you actually meant "third column", then the data structure you want isn't a map, but a tuple.

val l = List(("test1","test2","test3"), ("test4","test5", "test6"))

val thirdArgs= for(tuple<-l) yield tuple._3
// or equivalently val thirdArgs= l.map(_._3)
println(thirdArgs)// prints List(test3, test6)


Kim, we need an almost infinite amount of "hold my hand" simple Scala solutions posted on the web, so junior programmers can google them and get a running start. Here we go:

Maybe this is what you want:

 scala> val l = List(Map(1 -> "test1", 2 -> "test2", 3 -> "test3"), 

    | Map(1 -> "test4", 2 -> "test5", 3 -> "test6"))

>l: List[scala.collection.immutable.Map[Int,java.lang.String]] = List(Map(1 -> test1, 2 -> test2, 3 -> test3), Map(1 -> test4, 2 -> test5, 3 -> test6))

The you can get the third "row" like this:

scala> l.map( numMap => numMap(3))

res1: List[java.lang.String] = List(test3, test6)
0

精彩评论

暂无评论...
验证码 换一张
取 消