Недавно я обнаружил, что пишут либо запросы к БД или простой Seq
метода цепи, которые я хотел бы быть динамическими на основе пользовательского ввода, например:Условного метода построения цепочки на основе варианта
def between(from: Option[DateTime], to: Option[DateTime]): Seq[MyObject] = {
db.all() // let's say this returns Seq[MyObject]
/* Here I want to either restrict the upper/lower bounds with from/to if
they exist or take all the values otherwise */
}
Если бы я был ленив я d просто пойти с:
def between(from: Option[DateTime], to: Option[DateTime]): Seq[MyObject] = {
if(from.isEmpty && to.isEmpty) db.all()
else if(from.isEmpty) db.all().filter(_.date <= to.get)
else if(to.isEmpty) db.all().filter(_.date >= from.get)
else db.all().filter(_.date >= from.get && _.date <= to.get)
}
Очевидно filter
это просто пример, у меня та же проблема с, например take
, когда я хочу взять n
элементы или все они основаны на Option.
Но что делать, если у меня есть больше параметров? Каким будет идиоматический способ сделать это в Scala?
Я могу пойти с шаблоном, но это не сильно отличается от if/else
?
я мог бы сделать несколько vals
и сделать from.map(...).getOrElse()
но вводит временный vals
и снова не выглядит намного лучше, чем if/else
.
Есть ли другие трюки, которые я мог бы использовать?
Только вопрос, прежде чем пытаться ответить: есть ли смысл «между (Нет, Некоторые (...)» или «между (Нет, Нет)»? Я не думаю, что у него есть очевидная семантика и Я не знаю, что я должен ожидать, чтобы быть возвращенным как пользователь, поэтому я задаюсь вопросом, действительно ли этот метод имеет смысл вообще – Dici
@ Dici Хорошо, да, как я пытался показать в примере, 'между (None, None)' будет возвращать все объекты, 'между (None, Some (to))' будут помещать только * верхнюю * границу, поэтому все объекты, которые старше, чем 'to'. –
Да, так вы его реализовали, но это то, ожидать, т. е. это хороший API? – Dici