如何使以下Scala代码更具功能性和更少程序性?

del*_*ber 1 scala

我试图围绕功能编程概念.考虑从列表中删除空(零长度)字符串的问题

以下是Haskell中的一个纯函数实现,即使您对该语言一无所知也是如此

removeEmpty            :: [String] -> [String]
removeEmpty []          = []
removeEmpty ([] :strs)  = removeEmpty strs
removeEmpty (str:strs)  = str : removeEmpty strs
Run Code Online (Sandbox Code Playgroud)

现在考虑我在Scala中的实现

  def removeEmpty(dirty: List[String]): List[String] = {
    if (Nil == dirty)
      dirty
    else {
      if (dirty(0).length() == 0)
        removeEmpty(dirty.tail)
      else
        dirty.head::removeEmpty(dirty.tail)
    }
  }
Run Code Online (Sandbox Code Playgroud)

它做了同样的事情,但对它有一个非常程序化的感觉.是否有更多功能的方法在Scala中编写相同的方法?

Rue*_*ler 10

def removeEmpty(dirty: List[String]): List[String] = dirty match {
  case Nil      => Nil
  case "" :: xs => removeEmpty(xs)
  case  x :: xs => x :: removeEmpty(xs)
}
Run Code Online (Sandbox Code Playgroud)

Dirk的答案可能包含更好的解决方案,但我认为我的答案更接近原始答案.


Dir*_*irk 8

我想到的第一件事就是

list.filter(_.length > 0)
Run Code Online (Sandbox Code Playgroud)

不确定,这是否符合您"更具功能性"的标准,正如您未指定的那样,意味着什么......

  • 无论什么更有效,我认为`list.filter(!_.isEmpty)`读得更好. (4认同)