scala - 这个操作的好名字是什么?

标签 scala

我看到 Scala 标准库缺少获取集合中满足谓词的对象范围的方法:

def <???>(p: A => Boolean): List[List[A]] = {
  val buf = collection.mutable.ListBuffer[List[A]]()
  var elems = this.dropWhile(e => !p(e))
  while (elems.nonEmpty) {
    buf += elems.takeWhile(p)
    elems = elems.dropWhile(e => !p(e))
  }
  buf.toList
}

这种方法的好名字是什么?我的实现是否足够好?

最佳答案

我会选择 chunkWithchunkBy

至于您的实现,我认为这需要递归!看看你能不能填这个

@tailrec def chunkBy[A](l: List[A], acc: List[List[A]] = Nil)(p: A => Boolean): List[List[A]] = l match {
  case Nil => acc
  case l    =>
    val next = l dropWhile !p
    val (chunk, rest) = next span p
    chunkBy(rest, chunk :: acc)(p)
}

为什么要递归?它更容易理解算法并且更有可能没有错误(假设没有变量)。

谓词否定的语法 !p 是通过隐式转换实现的

implicit def PredicateW[A](p: A => Boolean) = new {
  def unary_! : A => Boolean = a => !p(a)
}

我通常会保留它,因为它非常有用

关于scala - 这个操作的好名字是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13005153/

相关文章:

arrays - 如何在 Scala 中为数组中的每个元素附加一个字母

scala - IDEA : scala multi module projet 中的模块资源根

java - 如何在 lift JSON 中序列化和反序列化 Java 8 dateTime?

scala - scala 中并行或顺序收集的类型

java - Google secret 管理器 API 和 Google 存储 API 不适用于 Apache Spark

scala - 你能就地对可变的 Scala 集合进行排序吗?

scala - Spark : Repartition strategy after reading text file

scala - 如何在scala sbt中获取资源文件夹下的加载文件

scala - "illegal cyclic reference involving object InterfaceAudience"使用 Scala 2.11 反射时

scala - 使用反射列出对象中的所有类