Шаблон для сопоставления с идентификатором и применения побочного эффекта

Есть ли более четкий способ выражения следующего шаблона:

def getUser(id: String): Option[User] = ???

getUser("12345").map { user =>
  someSideEffect(user)
  user
}

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

Future.andThen делает именно это:

Применяет побочную функцию к результату этого будущего и возвращает новое будущее с результатом этого будущего.

Есть что-то вроде Future.andThen но в общем случае для любого функтора?


person Mario Galic    schedule 07.02.2018    source источник


Ответы (2)


Нет ничего из коробки. Люди часто добавляют к нему что-то вроде этого:

 object ImplicitUtils {
    implicit class Utils[T](val t: T) extends AnyVal {
       def tap(f: T => Unit): T = { f(t) ; t }
    }
 }

Итак, теперь вы можете написать:

 import ImplicitUtils._
 val user = getUser("foo").tap(someSideEffect)
person Dima    schedule 07.02.2018

Scala 2.13 предоставляет его «из коробки» как tap

import scala.util.chaining._
Some(42) tap println

компаньон кошек mouse имеет его как <|

import mouse.all._
Some(42) <| println

которые оба выводят

Some(42)
res1: Some[Int] = Some(42)

Существует закрытая проблема по этой теме в репозитории кошек комбинатор Kestrel для Monad/Functor #1559 и обеспечение flatTap, но не tap.

person Mario Galic    schedule 17.09.2019