Почему Scala не имеет withFilterNot? - PullRequest
0 голосов
/ 17 ноября 2018

В коллекциях Scala, таких как Seq, у нас есть методы filter и, для удобства, filterNot. Последние позволяют нам написать, например,

seq.filterNot(someSet.contains)

вместо менее элегантного

seq.filter(e => !someSet.contains(e))

В дополнение к этим методам у нас есть класс WithFilter, чтобы можно было лениво оценивать условия фильтрации. Удобно, использование такое же, как с filter:

seq.withFilter(e => !someSet.contains(e))

Мой вопрос: почему у нас нет withFilterNot такого:

seq.withFilterNot(someSet.contains)

Более конкретно: это просто функция, которую разработчики Scala считают ненужной / с низким приоритетом, или есть техническая причина?

1 Ответ

0 голосов
/ 17 ноября 2018

Вы можете написать это еще короче: seq.filterNot(someSet)

Что касается .withFilterNot, вы можете легко добавить его самостоятельно, если считаете, что важно иметь:

object PimpSyntax {
   implicit class PimpedSeq[T](val seq: Seq[T]) extends AnyVal {
      def withFilterNot(filter: T => Boolean) = seq.withFilter(!f(_))
   }
}

Теперь просто import PimpSyntax._, и вы можете написать что-то вроде seq.withFilterNot(someSet) все, что вам нравится.

Или, еще лучше:

 object PimpSyntax {
     implicit class Negator[T](val f: T => Boolean) extends AnyVal {
        def unary_!: T => Boolean = !f(_)
     }
 }

С этим вы можете делать не только seq.withFilter(!someSet), но и такие вещи, как seq.partition(!someSet), seq.find(!someSet), seq.dropWhile(!someSet) и т. Д.

...