我正在做一些Scala体操,我有 Seq[T]
,其中我试图找到"smallest"元素 . 这就是我现在所做的:
val leastOrNone = seq.reduceOption { (best, current) =>
if (current.something < best.something) current
else best
}
它工作正常,但是对于这么简单的事情我有点长,而I don't care much for "if"s . 使用 minBy
会更优雅:
val least = seq.minBy(_.something)
...但是 min
和 minBy
在序列为空时抛出异常 . 是否有一种惯用的,更优雅的方式来查找可能为空的列表的最小元素 Option
?
8 回答
启动
Scala 2.13
,minByOption /maxByOption
现在是标准库的一部分,如果序列为空,则返回None
:做你想要的?
编辑:这是一个包含您的
_.something
的示例:或者,作为通用方法:
你可以调用
minOptionBy(seq)(_.something)
与Scalaz一起使用的安全,紧凑和
O(n)
版本:由于
O(nlogn)
复杂性,几乎没有任何更大列表的选项:这个怎么样?
或者,如果您不想吞下其他例外,则更详细:
或者,您可以使用以下内容对所有集合进行pimp:
然后写下
seq.minOptionBy(_.something)
.我以前遇到过同样的问题,所以我扩展了Ordered并实现了compare函数 . 这是一个例子:
所以,如果我有一个Point的seq,我可以要求max或min方法
你总是可以这样做:
然后使用像:
在Haskell中,你将minimumBy调用为