Я чувствую, что сообщество Scala немного одержимо написанием «краткий», «крутой», «scala idiomatic» , «один -лайнер "-если возможно- код. За этим сразу же следует сравнение с Java / императивным / некрасивым кодом.
Хотя это (иногда) приводит к легкому пониманию кода, это также приводит к неэффективному коду для 99% разработчиков. И именно здесь Java / C ++ нелегко превзойти.
Рассмотрим эту простую задачу: Дан список целых чисел, удалить самый большой элемент. Необязательно сохранять порядок.
Вот моя версия решения (Возможно, она не самая лучшая, но это то, что сделал бы среднестатистический разработчик, не принадлежащий к Rockstar).
def removeMaxCool(xs: List[Int]) = {
val maxIndex = xs.indexOf(xs.max);
xs.take(maxIndex) ::: xs.drop(maxIndex+1)
}
Это идиоматичный, лаконичный и использующий язык Scala несколько хороших функций списков. К тому же это очень неэффективно. Он проходит по списку не менее 3 или 4 раз.
Вот мое совершенно не крутое, похожее на Java решение. Это также то, что написал бы разумный Java-разработчик (или новичок в Scala).
def removeMaxFast(xs: List[Int]) = {
var res = ArrayBuffer[Int]()
var max = xs.head
var first = true;
for (x <- xs) {
if (first) {
first = false;
} else {
if (x > max) {
res.append(max)
max = x
} else {
res.append(x)
}
}
}
res.toList
}
Совершенно не-Scala идиоматический, нефункциональный, неточный, но очень эффективный. Он проходит по списку только один раз!
Итак, если 99% разработчиков Java пишут более эффективный код, чем 99% разработчиков Scala, это огромное препятствие, которое нужно преодолеть для более широкого принятия Scala. Есть ли выход из этой ловушки?
Я ищу практический совет, чтобы избежать таких «ловушек неэффективности», сохраняя при этом ясность и краткость реализации.
Пояснение: Этот вопрос исходит из сценария из реальной жизни: Пришлось написать сложный алгоритм. Сначала я написал его на Scala, потом мне «пришлось» переписать на Java. Реализация на Java была вдвое длиннее и не настолько четкой, но в то же время в два раза быстрее. Переписывание кода Scala для повышения его эффективности, вероятно, потребует некоторого времени и более глубокого понимания внутренней эффективности Scala (для сопоставления и сопоставления и т. Д.)