TMap[A]
是一种可以参与 STM 事务的可变映射。
创建一个 TMap
创建一个空的 TMap
:
import zio._
import zio.stm._
val emptyTMap: STM[Nothing, TMap[String, Int]] = TMap.empty[String, Int]
或创建具有指定值的 TMap:
import zio._
import zio.stm._
val specifiedValuesTMap: STM[Nothing, TMap[String, Int]] = TMap.make(("a", 1), ("b", 2), ("c", 3))
或者,您可以通过提供的元组集合来创建 TMap:
import zio._
import zio.stm._
val iterableTMap: STM[Nothing, TMap[String, Int]] = TMap.fromIterable(List(("a", 1), ("b", 2), ("c", 3)))
将键值对存入一个 TMap
可以通过以下方式将新的键值对添加到 map 映射:
import zio._
import zio.stm._
val putElem: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2))
_ <- tMap.put("c", 3)
} yield tMap).commit
在 map 中添加条目的另一种方法是使用 merge
:
import zio._
import zio.stm._
val mergeElem: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
_ <- tMap.merge("c", 4)((x, y) => x * y)
} yield tMap).commit
如果该键不存在于 map 中,则其行为类似于简单的 put
方法。否则,使用提供的函数将现有值与新值合并。
从 TMap 中删除元素
从 TMap 中删除键值对的最简单方法是使用采用 delete
删除某个键:
import zio._
import zio.stm._
val deleteElem: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
_ <- tMap.delete("b")
} yield tMap).commit
同样,它可以删除满足函数参数的每个键值对:
import zio._
import zio.stm._
val removedEvenValues: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3), ("d", 4))
_ <- tMap.removeIf((_, v) => v % 2 == 0)
} yield tMap).commit
或者,您可以保留所有与函数参数匹配的键值对:
import zio._
import zio.stm._
val retainedEvenValues: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3), ("d", 4))
_ <- tMap.retainIf((_, v) => v % 2 == 0)
} yield tMap).commit
请注意,retainIf
和 removeIf
与 filter
和 filterNot
具有相同的目的。但是分别命名它们的原因是要强调其本质上存在的区别。也就是,retainIf
和removeIf
都是破坏性的,调用它们会修改原集合。(而 filter
和 filterNot
只是返回新集合而不修改原集合)
从 TMap 中读取
可以通过以下方式获取与键关联的值:
import zio._
import zio.stm._
val elemGet: UIO[Option[Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
elem <- tMap.get("c")
} yield elem).commit
或者,如果 map 映射中不存在该键,则可以提供默认值:
import zio._
import zio.stm._
val elemGetOrElse: UIO[Int] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
elem <- tMap.getOrElse("d", 4)
} yield elem).commit
转换 TMap 中的条目
函数 transform((K, V) => (K, V))
可以用于为 map 映射中的每一个条目计算新的值:
import zio._
import zio.stm._
val transformTMap: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
_ <- tMap.transform((k, v) => k -> v * v)
} yield tMap).commit
请注意,它也可以用来压缩 TMap:
import zio._
import zio.stm._
val shrinkTMap: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
_ <- tMap.transform((_, v) => "d" -> v)
} yield tMap).commit
TransformM
可以用于效果化地映射条目:
import zio._
import zio.stm._
val transformMTMap: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
_ <- tMap.transformM((k, v) => STM.succeed(k -> v * v))
} yield tMap).commit
函数 transformValues(V => V)
可以为 map 中的每个值计算一个新值:
import zio._
import zio.stm._
val transformValuesTMap: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
_ <- tMap.transformValues(v => v * v)
} yield tMap).commit
可以通过 transformValuesM
效果化地处理 map 中的这些值:
import zio._
import zio.stm._
val transformValuesMTMap: UIO[TMap[String, Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
_ <- tMap.transformValuesM(v => STM.succeed(v * v))
} yield tMap).commit
请注意,transform
和 transformValues
的用途与 map
和 mapValues
相同。 之所以分别命名它们的原因是要强调其本质上的区别。也就是说,transform
和 transformValues
都是破坏性的,调用它们可以修改原集合。
fold
使用指定的两个关联运算来遍历折叠 TMap 中的元素:
import zio._
import zio.stm._
val foldTMap: UIO[Int] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
sum <- tMap.fold(0) { case (acc, (_, v)) => acc + v }
} yield sum).commit
foldM
可以效果化地折叠原属:
import zio._
import zio.stm._
val foldMTMap: UIO[Int] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
sum <- tMap.foldM(0) { case (acc, (_, v)) => STM.succeed(acc + v) }
} yield sum).commit
对 TMap 键值对执行side effect计算
foreach
用于对映射中的每个键值对执行 side-effect 计算:
import zio._
import zio.stm._
val foreachTMap = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
_ <- tMap.foreach((k, v) => STM.succeed(println(s"$k -> $v")))
} yield tMap).commit
检查 TMap 中的成员
检查键值对是否存在于 TMap 中:
import zio._
import zio.stm._
val tMapContainsValue: UIO[Boolean] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
res <- tMap.contains("a")
} yield res).commit
将 TMap 转换为 List
可以通过以下方式转换成元组列表:
import zio._
import zio.stm._
val tMapTuplesList: UIO[List[(String, Int)]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
list <- tMap.toList
} yield list).commit
可以按如下方式获得键列表:
import zio._
import zio.stm._
val tMapKeysList: UIO[List[String]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
list <- tMap.keys
} yield list).commit
可以按以下方式获得值列表:
import zio._
import zio.stm._
val tMapValuesList: UIO[List[Int]] = (for {
tMap <- TMap.make(("a", 1), ("b", 2), ("c", 3))
list <- tMap.values
} yield list).commit