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

时间:2011-07-10 08:25:32

标签: scala

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

以下是Haskell中一个纯粹的功能实现,即使你对语言一无所知也是非常易读的

removeEmpty            :: [String] -> [String]
removeEmpty []          = []
removeEmpty ([] :strs)  = removeEmpty strs
removeEmpty (str:strs)  = str : removeEmpty strs

现在考虑我在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)
    }
  }

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

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:8)

我想到的第一件事是

list.filter(_.length > 0)

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