Scalaの勉強中

今更だけどScalaを勉強してみることにした。
文法を流し読みして分かった気になったので、とりあえずProject Eularの問題を解いてみる。


Problem 1 「3と5の倍数」 †

10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

Project Eulerの日本語訳より
Scalaらしい書き方が思いつかなかったので普段の手続き型言語で書くような感じで書いてみた。

object Problem01 {
	def main(args: Array[String]): Unit = {
		var sum = 0
		for (i <- 1 until 1000) {
			if (i%3==0 || i%5==0) {
				sum += i
			}
		}
		println(sum)
	}
}

表示された答えは合ってると思うんだけど、なんかレガシー感漂うコードでせっかくScalaを使ってるのに
コレジャナイ感がすごい
すこし書きなおしてみる

object Problem01 {
	def main(args: Array[String]): Unit = {
		var sum1 = 0
		(1.until(1000)).filter((x:Int)=>x%3==0 || x%5==0).map((y:Int)=>sum1+=y)
		println(sum1)
	}
}

さっきよりはすっきりしたけど、まだなんか微妙
特に関数型言語使っておきながら、varとか使っちゃってるところとか。
varを消すように書き直してみた

object Problem01 {
	def main(args: Array[String]): Unit = {
		val sum2 = (1.until(1000)).filter((x:Int)=>x%3==0 || x%5==0).sum
		println(sum2)
	}
}

うん、とてもすっきりした。良い感じ
それにしても標準でリストの総和関数提供してくれるなんて便利だなぁ