TArray

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

BACK TO TOP