我经常遇到这样的情况:我有一个对象,只有在某个条件成立时我才想修改它。如下所示:
if (condition(object)) return modify(object)
else return object
在JS中,Ramda库提供了一个when函数,它正是这样做的:
when(condition)(modify)(object)
我未能找到的是在Scala中这样做的简洁方法。目前我有自己的隐式包装器:
implicit class WhenWrapper[T](a: T) {
def when(condition: T => Boolean)(modify: T => T): T =
if (condition(a)) modify(a)
else a
}
允许我做
之类的事情someString.when(_.length > 5)(_.reverse)
Scala中是否有类似的功能可以实现同样的功能?
编辑(更现实的例子):
if语句适用于大多数情况,而这个问题仅仅是出于好奇。当在链接到管道的对象上编写一堆变换器时,这种方法很有用。我们定期使用Spray中的HTTPRequest
进行此操作。
def addAcceptHeaderIfCondition(condition: HTTPRequest => Boolean): RequestTransformer = { r =>
if (condition(r)) addHeader("Accept", acceptHeaderMediaType)(r)
else r
}
将用作管道的一部分:
def pipeline: SendReceive = {
somePipeline ~>
addHeaderIfCondition(someToggle) ~>
morePipeline
}
显式传递r
似乎是不必要的,例如:
def addAcceptHeaderIfCondition(condition: HTTPRequest => Boolean): RequestTransformer = _.when(condition)(addHeader("Accept", acceptHeaderMediaType))
只是感觉更整洁。