Часто мне хочется привязать побочную функцию к концу вызова другого метода более функциональным способом, но я не хочу преобразовывать исходный тип в Unit
. Предположим, у меня есть метод read
, который ищет запись в базе данных и возвращает Option[Record]
.
def read(id: Long): Option[Record] = ...
Если read
возвращает Some(record)
, то я мог бы закэшировать это значение и двигаться дальше. Я мог бы сделать что-то вроде этого:
read(id).map { record =>
// Cache the record
record
}
Но я хотел бы избежать приведенного выше кода и получить что-то более похожее на это, чтобы было более понятно, что происходит:
read(id).withSideEffect { record =>
// Cache the record
}
Где withSideEffect
возвращает то же значение, что и read(id)
. После поиска сверху и снизу я не могу найти ни одного метода для любого типа, который делает что-то подобное. Самое близкое решение, которое я могу придумать, это использовать неявную магию:
implicit class ExtendedOption[A](underlying: Option[A]) {
def withSideEffect(op: A => Unit): Option[A] = {
underlying.foreach(op)
underlying
}
}
Есть ли какие-то типы Scala, которые я мог пропустить с помощью таких методов? И есть ли потенциальные конструктивные недостатки при использовании такого метода?
def f(a: A): a.type
должен возвращать предоставленный экземплярA
. - person J Cracknell   schedule 10.09.2014