Я довольно новичок в Scala, но мне нравится знать, что является предпочтительным способом решения этой проблемы.Скажем, у меня есть список предметов, и я хочу знать общее количество предметов, которые являются чеками.Я мог бы сделать что-то вроде этого:
val total = items.filter(_.itemType == CHECK).map(._amount).sum
Это дало бы мне то, что мне нужно, сумму всех проверок в неизменяемой переменной.Но он делает это с тем, что похоже на 3 итерации.Один раз для фильтрации чеков, снова для сопоставления сумм, а затем суммы.Другим способом было бы сделать что-то вроде:
var total = new BigDecimal(0)
for (
item <- items
if item.itemType == CHECK
) total += item.amount
Это дает мне тот же результат, но с 1 итерацией и изменяемой переменной, которая тоже выглядит хорошо.Но если бы я хотел извлечь больше информации, скажем, общее количество проверок, для этого потребовалось бы больше счетчиков или изменяемых переменных, но мне не пришлось бы повторять список снова.Не похоже на «функциональный» способ достижения того, что мне нужно.
var numOfChecks = 0
var total = new BigDecimal(0)
items.foreach { item =>
if (item.itemType == CHECK) {
numOfChecks += 1
total += item.amount
}
}
Так что, если вам понадобится куча счетчиков или итогов в списке, лучше оставить изменяемые переменные или не беспокоиться об этом, сделайте что-то вроде:
val checks = items.filter(_.itemType == CHECK)
val total = checks.map(_.amount).sum
return (checks.size, total)
, который кажется более простым для чтения и использует только vals