Как использовать значение в качестве параметра для целевой функции - PullRequest
2 голосов
/ 14 мая 2019

Я понимаю, что на это можно где-то ответить, но мне не хватает правильных терминов, чтобы даже искать его. Как я могу продолжать составлять функции вместе, если в определенной точке потока мне нужно использовать текущий результат в качестве параметра функции?

Представьте себе эту простую ситуацию:

Seq(1, 2, 3).map(_ * 2)
            .map(doSomethingElseToEachValue(_))
            .useAsParameterIn(functionThatTakesTheWholeSequence(_))

Конечно, это может быть просто сделано путем назначения промежуточного результата для val и использования этого:

val intermeditateSeq = Seq(1, 2, 3)
    .map(_ * 2)
    .map(doSomethingElseToEachValue(_))
functionThatTakesTheWholeSequence(intermediateSeq)

Или, обернув функцию вокруг всего, но это ухудшает читаемость, поскольку поток выполнения движется взад и вперед по мере того, как вы читаете ее. Это также приводит к искаженному беспорядку, если у вас есть несколько из этих операций, переплетенных.

Как сохранить логический поток слева направо и сверху вниз, когда мне нужно использовать весь объект в качестве параметра, а не просто отображать его содержимое?

Ответы [ 2 ]

4 голосов
/ 14 мая 2019

Первое, что вы можете сделать, это просто сопоставить:

Seq(1, 2, 3)
  .map(_ * 2)
  .map(doSomethingElseToEachValue) match {
      case xs => functionThatTakesTheWholeSequence(xs)
  }

В Scala 2.13 появилась новая лучшая возможность с pipe :

Seq(1, 2, 3)
  .map(_ * 2)
  .map(doSomethingElseToEachValue)
  .pipe(functionThatTakesTheWholeSequence)

На самом деле пишет pipe довольно просто, поэтому, если вы не можете использовать 2.13 , но хотите использовать pipe , просто скопируйте функцию расширения из исходного кода 2.13 :

implicit class ChainingOps[A](private val self: A) extends AnyVal {
   def pipe[B](f: A => B): B = f(self)
}
1 голос
/ 14 мая 2019

если вы хотите выполнять подобные операции только в Seq[Int], вы можете создать неявный класс.

implicit class daClazz(list: Seq[Int]){
  def useAsParameterIn()= {
    //do stuff here
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...