【发布时间】:2014-09-22 20:20:00
【问题描述】:
假设我有一个 Scala 列表 List("apple", "orange", "banana", "chinese gooseberry")*。我想搜索此列表并返回列表中与我已有的项目相关的上一个项目。
例如:getPrevious(fruit: String, fruits: List[String]): Option[String] 应该返回
-
Some("apple")如果我用fruitarg of"orange"调用它; -
Some("banana")为"chinese gooseberry"; -
None如果我用"apple"(不存在先前的元素)或"potato"(不在列表中)调用它。
命令式很容易完成,但我怎样才能以优雅的功能方式做到这一点?我能想到的最好的方法如下:
def previous(fruit: String, fruits: List[String]): Option[String] =
fruits.sliding(2)
.filter { case List(previous, current) => current == fruit }
.toList
.headOption
.map { case List(previous, current) => previous }
它有效,但并不优雅或高效。我特别讨厌转换filter 迭代器toList。我该如何改进它?
(*顺便说一句,List 是用于sliding 迭代的最佳集合吗?)
【问题讨论】: