Да, будет создано Some
объектов (None
- одиночный).Если, конечно, JVM не исключит, что это зависит от многих факторов, в том числе от того, считает ли JVM, что код все-таки называется кодом.В этом есть даже мем: когда-то один опытный разработчик Scala написал такой код, когда другой ответил: «Что это? Любительский час? Плоская карта, которая д * т!»d переписать его:
( counts
get word
map (_.toDouble / total_tokens * (1.0 - unseen_mass))
getOrElse (
WordDist.overall_word_probs
get word
map (unseen_mass * _ / overall_unseen_mass)
getOrElse (unseen_mass * WordDist.globally_unseen_word_prob
/ WordDist.num_unseen_word_types)
)
)
Затем вы можете выполнить рефакторинг этого - оба параметра getOrElse
могут быть разделены в другом методе с хорошими именами.Поскольку они просто возвращают значение без ввода, они должны быть довольно быстрыми.
Теперь мы вызовем здесь только два метода на Option
: map
и getOrElse
.Вот начало их реализации:
@inline final def map
@inline final def getOrElse
Поскольку параметр в getOrElse
передается по имени, он включает создание анонимной функции.И, конечно же, параметр map
также является функцией.Кроме этого, вероятность того, что эти методы будут встроены, довольно велика.
Итак, вот переработанный код, хотя я не знаю достаточно об этом, чтобы дать хорошие имена.
def knownWordsFrequency = counts get word map computeKnownFrequency
def computeKnownFrenquency =
(_: Int).toDouble / total_tokens * (1.0 - unseen_mass)
def probableWordsFrequency = (
WordDist.overall_word_probs
get word
map computeProbableFrequency
)
def computeProbableFrequency = unseen_mass * (_: Double) / overall_unseen_mass
def unknownFrequency = (unseen_mass * WordDist.globally_unseen_word_prob
/ WordDist.num_unseen_word_types)
def estimatedWordsFrequency = probablyWordsFrequency getOrElse unknownFrequency
knownWordsFrequency getOrElse estimatedWordsFrequency