Scala版本的Ramda'当'

时间:2016-12-14 08:40:01

标签: scala functional-programming

我经常遇到这样的情况:我有一个对象,只有在某个条件成立时我才想修改它。如下所示:

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))
只是感觉更整洁。

0 个答案:

没有答案