gpt4 book ai didi

scala - Scala 选项类型上的“tee”操作?

转载 作者:行者123 更新时间:2023-12-03 09:11:26 25 4
gpt4 key购买 nike

Scala 标准库中的 Option 是否有某种“tee”操作?我能找到的最好的是 foreach,但是它的返回类型是 Unit,因此它不能被链接。

这就是我正在寻找的:给定一个 Option 实例,如果该选项不为空,则执行一些对其值有副作用的操作(Some[A] ),否则什么也不做;在任何情况下都返回该选项。

我有一个使用隐式类的自定义实现,但我想知道是否有更常见的方法可以在不进行隐式转换的情况下执行此操作:

object OptionExtensions {
implicit class TeeableOption[A](value: Option[A]) {
def tee(action: A => Unit): Option[A] = {
value foreach action
value
}
}
}

示例代码:

import OptionExtensions._

val option: Option[Int] = Some(42)
option.tee(println).foreach(println) // will print 42 twice

val another: Option[Int] = None
another.tee(println).foreach(println) // does nothing

有什么建议吗?

最佳答案

为了避免隐式转换,您可以使用带有 k-combinator 的函数组合,而不是使用方法链接。k-combinator 为您提供了一种惯用的方式来传达您将要执行副作用的事实。

这是一个简短的示例:

object KCombinator {
def tap[A](a: A)(action: A => Any): A = {
action(a)
a
}
}

import KCombinator._

val func = ((_: Option[Int]).getOrElse(0))
.andThen(tap(_)(println))
.andThen(_ + 3)
.andThen(tap(_)(println))

如果我们使用 Option(3) 参数调用 func,结果将是一个值为 6 的 Int控制台如下所示:

3

6

关于scala - Scala 选项类型上的“tee”操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42138798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com