TArray
是可以参与 STM 事务的可变引用的数组。
创建一个 TArray
创建一个空的 TArray
:
import zio._
import zio.stm._
val emptyTArray: STM[Nothing, TArray[Int]] = TArray.empty[Int]
或创建具有指定值的 TArray
:
import zio._
import zio.stm._
val specifiedValuesTArray: STM[Nothing, TArray[Int]] = TArray.make(1, 2, 3)
或者,您可以通过指定的集合来创建 TArray:
import zio._
import zio.stm._
val iterableTArray: STM[Nothing, TArray[Int]] = TArray.fromIterable(List(1, 2, 3))
从 TArray 读取值
可以通过以下方式获得数组的第 n 个元素:
import zio._
import zio.stm._
val tArrayGetElem: UIO[Int] = (for {
tArray <- TArray.make(1, 2, 3, 4)
elem <- tArray(2)
} yield elem).commit
访问不存在的索引会引发 ArrayIndexOutOfBoundsException
异常并中止事务。
更新 TArray 中的值
可以按照以下步骤更新数组的第n个元素:
import zio._
import zio.stm._
val tArrayUpdateElem: UIO[TArray[Int]] = (for {
tArray <- TArray.make(1, 2, 3, 4)
_ <- tArray.update(2, el => el + 10)
} yield tArray).commit
可以通过 updateM
效果化地更新数组的第n个元素:
import zio._
import zio.stm._
val tArrayUpdateMElem: UIO[TArray[Int]] = (for {
tArray <- TArray.make(1, 2, 3, 4)
_ <- tArray.updateM(2, el => STM.succeed(el + 10))
} yield tArray).commit
更新不存在的索引会引发 ArrayIndexOutOfBoundsException
并中止事务。
转换 TArray 的元素
transform(A => A)
函数可以为数组中的每一个元素计算新值:
import zio._
import zio.stm._
val transformTArray: UIO[TArray[Int]] = (for {
tArray <- TArray.make(1, 2, 3, 4)
_ <- tArray.transform(a => a * a)
} yield tArray).commit
可以通过 transformM
效果化地映射元素:
import zio._
import zio.stm._
val transformMTArray: UIO[TArray[Int]] = (for {
tArray <- TArray.make(1, 2, 3, 4)
_ <- tArray.transformM(a => STM.succeed(a * a))
} yield tArray).commit
fold
通过两个指定的运算遍历折叠 TArray 中的元素:
import zio._
import zio.stm._
val foldTArray: UIO[Int] = (for {
tArray <- TArray.make(1, 2, 3, 4)
sum <- tArray.fold(0)(_ + _)
} yield sum).commit
可以通过 foldM
效果化地进行遍历折叠:
import zio._
import zio.stm._
val foldMTArray: UIO[Int] = (for {
tArray <- TArray.make(1, 2, 3, 4)
sum <- tArray.foldM(0)((acc, el) => STM.succeed(acc + el))
} yield sum).commit
对 TArray 元素执行 side-effect 运算
foreach
用于对数组中的每个元素执行 side-effect 运算:
import zio._
import zio.stm._
val foreachTArray = (for {
tArray <- TArray.make(1, 2, 3, 4)
_ <- tArray.foreach(a => STM.succeed(println(a)))
} yield tArray).commit