TMap

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

请注意,retainIfremoveIffilterfilterNot 具有相同的目的。但是分别命名它们的原因是要强调其本质上存在的区别。也就是,retainIfremoveIf 都是破坏性的,调用它们会修改原集合。(而 filterfilterNot 只是返回新集合而不修改原集合)

从 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

请注意,transformtransformValues 的用途与 mapmapValues 相同。 之所以分别命名它们的原因是要强调其本质上的区别。也就是说,transformtransformValues 都是破坏性的,调用它们可以修改原集合。

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
Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP