在Scala语言中,面向函数编程也是一个非常有趣也是非常重要的特性,高阶函数是函数式编程的核心,能够极大地提升代码的抽象和复用性。
这边我们给出一个需求来引入:
第一列是1000个学生的学号,第二列是六门科目的代码,第三列是科目对应的成绩,我们这里的需求就是如何统计每一位同学的六门科目的成绩之和,怎么操作呢?如果使用java代码来进行实现,不难想到,我们需要进行很多次分开的调用,先用split()方法进行切分,然后将每行记录中的学号和成绩储存在一个list中,然后用map中的方法对list中的成绩进行累加,工作量之大还是可以想象的,但是如果我们使用scala进行编写,那可就简单多了
object show {
def main(args: Array[String]): Unit = {
val list: List[String] = Source
.fromFile("data/score.txt")
.getLines().toList
val singlescore: List[(String, Int)] = list.map(score => {
val strings: Array[String] = score.split(",")
val id: String = strings(0)
val soloscore: Int = strings(2).toInt
(id, soloscore)
})
val scoree: Map[String, List[(String, Int)]] = singlescore.groupBy(_._1)
scoree.map((kv:(String, List[(String, Int)]))=>{
val id: Int = kv._1.toInt
val list: List[(String, Int)] = kv._2
val values: List[Int] = list.map(scor => scor._2)
val sum: Int = values.sum
(id,sum)
}).foreach(println)
}
}
虽然比java代码要简洁不少,但是如此之多的中间量看上去还是让人有些心烦意乱,现在我们可以使用Scala中最优雅的代码来解决————链式调用
Source.fromFile("data/score.txt")
.getLines()
.toList
.map(_.split(","))
.map(arr => (arr(0), arr(2).toInt))
.groupBy(_._1)
.mapValues(_.map(_._2).sum)
.map { case (id, sum) => (id.toInt, sum) }
.foreach(println)
不断使用_来进行函数的调用,非常优雅,值得大家学习。
优雅,简洁,这就是scala语言的精髓。