Добавить опцию [T] в вектор [T] - PullRequest
2 голосов
/ 02 апреля 2020

Как лучше всего выполнять такую ​​операцию? Добавьте T к Vector[T], если T равно Some[T], иначе ничего не делайте. Эта ужасная вещь работает

val v: Vector[Int] = Vector(1, 2, 3) ++ Some(5).toSeq

Но преобразование Option в Seq далеко не интуитивно понятно. Я думал об определении неявного для Vector и Option, но мне было интересно, есть ли что-то из коробки, которое я могу использовать.

Я ожидал бы, что что-то подобное сработает

   val v: Vector[Int] = Vector(1, 2, 3) :+ Some(5) 

Но, очевидно, Option - это НЕ Traversable.

Ответы [ 3 ]

5 голосов
/ 02 апреля 2020

Нет ничего плохого в Vector(1, 2, 3) ++ Some(5).toSeq, как обычно это делается.

Экспериментируя с кодом, чтобы ответить на ваш вопрос, я обнаружил, что (что удивительно для меня) вам не нужно писать toSeq даже в Scala 2.10 - 2.12, благодаря option2Iterable, определенному в scala.Option сопутствующем объекте. Это неявное преобразование гарантирует, что Option может использоваться там, где ожидается Iterable, что достаточно для оператора Vector.++.

Следующие работы: Vector(1, 2, 3) ++ Some(5)

Вам не нужно используйте toSeq даже при объединении нескольких параметров, например Some(1) ++ Some(2) - в результате получается List(1, 2).

В Scala 2,13 Option получается из IterableOnce, поэтому даже неявное преобразование не необходимо.

3 голосов
/ 02 апреля 2020

Option было сделано IterableOnce в Scala 2,13 Сделать параметр расширением IterableOnce # 8038

sealed abstract class Option[+A] extends IterableOnce[A] with Product with Serializable

, поэтому должно работать следующее Scala 2,13

Vector(1, 2, 3) ++ Some(5)
Vector(1, 2, 3) ++ None
// res1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 5)
// res2: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)
2 голосов
/ 02 апреля 2020

Я бы соответствовал шаблону это.

val v: Vector[Int] = optional match {
  case Some(x) => Vector(1, 2, 3) :+ x
  case None => Vector(1, 2, 3)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...