Ruby的注入方法就像Scala集合一样:任何想法?

时间:2013-08-15 23:07:18

标签: scala scala-collections

我正试图弄清楚如何在Scala中执行此操作

我有一个

List( MyObject(id, name, status), ..., MyObject(id, name, status) )

我希望将一个函数应用于此集合,以获取包含MyObjects的所有“id”属性的List

List( id1, id2, .., idN)

我想要类似Ruby的注入方法:

list.inject( [] ){ |lst, el| lst << el }

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以使用List(实际上是TraversableLike)的地图功能,如下所示:list.map(_.id)。 Scala集合类有很多有用的方法 - 非常值得学习。

答案 1 :(得分:2)

在这种情况下,使用list.map(_.id)是最佳解决方案。显然,还有很多其他方法可以做到这一点。下面是两个例子。

注入数组

将所选元素添加到数组中,例如:

    > list = [1,2,3]
     => [1,2,3]
    > list.inject([]) { |list,el| list << "Element #{el}"  if (el % 2 == 0); list }
     => ["Element 2"] 

可能在Scala中实现为:

    > val list = List(1,2,3)
    list: List[Int] = List(1, 2, 3)
    > val map = list.map(x => if (x % 2 == 0) Some(s"Element $x") else None).flatten
    map: List[String] = List(Element 2)

注入哈希

遵循Ruby代码注入哈希:

    > list = [1,2,3]
     => [1,2,3]
    > list.inject({}) { |memo,x| memo[x] = "Element #{x}"; memo }
     => {1=>"Element 1", 2=>"Element 2", 3=>"Element 3"} 

可以在Scala中完成:

    > val list = List(1,2,3)
    list: List[Int] = List(1, 2, 3)
    > val map = list.map(x => (x -> s"Element $x")).toMap
    map: scala.collection.immutable.Map[Int,String] = Map(1 -> Element 1, 2 -> Element 2, 3 -> Element 3)