0

编辑
好的,@dhg 发现如果 fold() 的代码块未绑定到 val 则需要点方法语法(为什么在同一个代码块中使用 reduce() 可以使用空格方法语法,我不知道)。无论如何,最终结果是非常简洁的:

result.map { row =>
  addLink( row.href, row.label )
}.fold(NodeSeq.Empty)(_++_)

这在某种程度上否定了原始问题;即,在许多情况下,人们可以对非/或场景进行高阶处理,并避免“胖”、重复的 if/else 语句。

ORIGINAL
尝试在处理可能为空的集合(如 List[T])时减少 if/else 处理

例如,假设我需要获取最新的新闻文章来构建html 新闻的NodeSeq<li><a>links</a></li>

val result = dao.getHeadlines // List[of model objects]
if(result.isEmpty) NodeSeq.Empty
else 
  result map { row =>
    addLink( row.href, row.label ) // NodeSeq
  } reduce(_ ++ _)

这没关系,非常简洁,但我发现自己想要采用三元风格来解决这些永远是非此即彼的情况:

result.isEmpty ? NodeSeq.Empty :
  result map { row =>
    addLink( row.href, row.label )
  } reduce(_ ++ _)

我已经看到一些关于将三元数据拉到布尔值上的旧帖子,但很想知道有什么替代方案(如果有的话)来简化 if/else?

match {...}是,IMO 对于这种情况有点臃肿,而且for {...} yield似乎也没有多大帮助。

4

1 回答 1

3

你根本不需要检查空虚。只需使用fold而不是reduce因为fold允许您指定默认的“空”值:

scala> List(1,2,3,4).map(_ + 1).fold(0)(_+_)
res0: Int = 14

scala> List[Int]().map(_ + 1).fold(0)(_+_)
res1: Int = 0

这是一个带有 a Listof Seqs 的示例:

scala> List(1,2).map(Seq(_)).fold(Seq.empty)(_++_)
res14: Seq[Int] = List(1, 2)

scala> List[Int]().map(Seq(_)).fold(Seq.empty)(_++_)
res15: Seq[Int] = List()

编辑:看起来您的示例中的问题与.在方法之间删除点 () 字符有关。如果您将它们保留在其中,则一切正常:

scala> List(1,2,3).map(i => node).fold(NodeSeq.Empty)(_ ++ _)
res57: scala.xml.NodeSeq = NodeSeq(<li><a href="/foo">Link</a></li>, <li><a href="/foo">Link</a></li>, <li><a href="/foo">Link</a></li>)
于 2012-04-08T18:26:51.997 回答