编辑
好的,@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
似乎也没有多大帮助。