繁体   English   中英

scala中的foreach()返回一个Seq。 如何到达该项目?

[英]foreach() in scala returns a Seq. How to get to the item?

我正在尝试将列表的每个元素添加到MutableSet。

节约:

Obj {
  list<Tag> myList;
}

enum Tag {
  ...
}

斯卡拉:

val uniqueTags = Set[Tag]()
// obj is of type Obj defined in the thrift above
obj.flatMap(_.myList).foreach(uniqueTags += _)

然而,编译器说我正在尝试添加Seq[Tag]而不是Tag 如何到达Seq代表的元素?

此外,我确信还有另一种方法可以直接使用列表初始化Set。 我尝试了obj.flatMap(_.myList).toSet()Set[Tag](obj.flatMap(_.myList)) )但没有一个工作。

你不需要迭代来寻找唯一的, scala就是为你做了toSet

使用toSet示例:

scala> case class Obj(myList: List[String])
defined class Obj

scala> val obj = Option(Obj(myList = List("metal", "rock", "prog", "pop", "pop")))
obj: Option[Obj] = Some(Obj(List(metal, rock, prog, pop, pop)))

现在,要获得唯一标签,

scala> val uniqueTags = obj.map(_.myList).getOrElse(List.empty[String]).toSet
uniqueTags: scala.collection.immutable.Set[String] = Set(metal, rock, prog, pop)

foreach不建议在fp世界中改变东西。 另一种方法是使用累加器模式 - foldLeft

scala> import scala.collection.immutable.Set
import scala.collection.immutable.Set

scala> obj.map(_.myList).getOrElse(List.empty[String]).foldLeft(Set[String]()){ case (s, e) => s + e }
res15: scala.collection.immutable.Set[String] = Set(metal, rock, prog, pop)

可变的方法是在你做的时候使用forach ,(不推荐)

scala> val uniqueTags = scala.collection.mutable.Set[String]()
uniqueTags: scala.collection.mutable.Set[String] = HashSet()

scala> obj.map(_.myList).getOrElse(List.empty[String]).foreach { elem => uniqueTags += elem }

scala> uniqueTags
res13: scala.collection.mutable.Set[String] = HashSet(metal, rock, pop, prog)

我不确定什么是Obj。 但在你的情况下: obj.flatMap(_.myList)将给出一个Tag列表。 我认为正确的方法是:

obj.flatMap(_.myList).foreach(uniqueTags += _)

我认为你可以在Scala中使用mutable。 没什么大不了的。 根据你的obj,你可以使用不同的方式将元素追加到集合中

case class Obj(myList: List[String])
val obj = Obj(List("1", "2", "3"))

// first example when your obj is a single Obj
val uniqueTags = mutable.Set[String]()
// obj is of type Obj defined in the thrift above
obj.myList.foreach(uniqueTags += _)
printf(uniqueTags.toString()) // give you Set(1, 2, 3)

// second example when your obj is a list of Obj
val obj2 = List(obj, obj, obj)
val uniqueTags2 = mutable.Set[String]()
obj2.flatMap(_.myList).foreach(uniqueTags2 += _)
printf(uniqueTags2.toString()) // give you Set(1, 2, 3) also

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM