如果列表不为空,scala或scalaz中是否有函数将函数应用于列表?

时间:2013-08-31 23:55:24

标签: scala scalaz

如果列表不为空,scala或scalaz中是否有函数将函数应用于列表。否则它会返回一些默认值。该函数必须应用于列表本身而不是列表的元素。也就是说,它完成以下任务:

implicit class RichList[A, M[A] <: Iterable[A]](list: M[A]) {
  def convertOrElse[B](fn: M[A] => B, whenEmpty: B) = {
    if (!list.isEmpty) fn(list) else whenEmpty
  }
}

用法示例:    mylist.convertOrElse(“prefix”+ _.mkString(“,”),“”)

我记得在某个地方看过这个,但可能是在博客文章或其他一些内容中。我现在似乎无法在scalaz中找到它,但我甚至无法在网上找到最新的scalaz文档(这是一个不同的问题:)

我已经编写了我自己隐含的内容,但是我讨厌在适当的scalaz导入时添加我自己的隐含。

2 个答案:

答案 0 :(得分:6)

您应该可以像以下一样使用Scalaz的NonEmptyList功能:

import scalaz._
import Scalaz._        
val list = List()    
val str = list.toNel.map(_.list.mkString(",")).getOrElse("empty")
println(str)

在我的示例中,您会看到“空”这个词被打印出来。如果您将列表定义更改为:

val list = List("foo", "bar")

然后你会看到“foo,bar”被打印出来。

答案 1 :(得分:2)

如果不使用Scalaz,您还可以执行以下操作之一:

  • Option(list).filterNot(_.isEmpty).map(f)
  • list match { case x@(_ :: _) => Some(f(x)); case _ => None }