美文网首页ScalaScalascala-筑基篇
酷炫的一行代码 - Scala就是这么任性!

酷炫的一行代码 - Scala就是这么任性!

作者: joymufeng | 来源:发表于2016-11-09 10:14 被阅读175次

    得益于Scala优雅的设计,很多常见的功能都可以用一行代码实现,简洁的同时不乏表现力,就算你不熟悉Scala,通过代码你也能大致猜出它的含义,这也从一个侧面说明Scala是一门强大的编程语言。

    过滤出序列中所有偶数

    filter方法会将序列中各个元素依次替换到下划线"_"所处位置,如果返回true,则保留该元素。

    (1 to 9).filter( _ % 2 == 0 )
    

    输出:2, 4, 6, 8

    对序列中所有元素求和

    reduceLeft是一个通用的聚集计算方法,你可以把"+"换成其它的运算。其实对于求和有更简单的方法,请参考第6条。

    (1 to 9).reduceLeft(_ + _)
    

    输出:45

    统计单词出现次数

    groupBy方法可以将序列转换成Map,适合用在需要按某个属性进行统计的情况。

    List("no", "zuo", "no", "die").groupBy(w => w).mapValues(_.length)
    

    输出:Map(no -> 2, zuo -> 1, die -> 1)

    将序列中单词首字母大写

    map可以把序列转换成另一个序列,在map方法中定义各个元素的转换过程。

    List("one", "line", "of", "code").map(_.capitalize)
    

    输出:List(One, Line, Of, Code)

    将序列拼接成字符串

    mkString方法用于将序列拼接成字符串,第1个参数是起始符号,第2个参数是分隔符,第3个参数是结束符号。

    (1 to 9).mkString("(", ",", ")")
    

    输出:(1,2,3,4,5,6,7,8,9)

    最大值,最小值和求和

    这在Scala中轻而易举,直接调用min,max和sum方法。

    List(14, 35, -7, 46, 98).min 
    List(14, 35, -7, 46, 98).max 
    List(14, 35, -7, 46, 98).sum
    

    输出:-7 98 186

    获取序列中最大的前3个数值和位置

    zipWithIndex方法将序列List[Int]转换成List[(Int, Int)],即List[Tuple2[Int, Int]]。Tuple2的第1个Int是元素,第2个Int是元素所处的位置。

    List(2, 0, 1, 4, 12, 5).zipWithIndex.sorted.reverse.take(3)
    

    输出:List((12,4), (5,5), (4,3))

    读取文本文件

    在Scala中读取文本文件相当轻松。

    val fileContent = io.Source.fromFile("myfile.txt").mkString
    val fileLines = io.Source.fromFile("myfile.txt").getLines.toList
    

    下载URL链接

    下载文件就是这么容易。其实利用sys.process包,我们可以用Scala编写Shell脚本,是不是很酷!

    import sys.process._
    import java.net.URL
    import java.io.File
    new URL("http://www.oschina.net/favicon.ico") #> new File("d:/favicon.ico") !!
    

    并行计算

    par方法将原序列转换成并行序列,可以利用多核的优势加快处理速度,真是想得太周到了!

    (1 to 99).par.sum
    

    两个List相乘求和

    类似加权求和。

    dataList.zip(weightList).map{t => t._1 * t._2}.sum
    

    按多个字段排序List

    先按学生的年龄排序,如果年龄相同,则按分数排序:

        case class Student(name: String, age: Int, score: Int)
        List(
          Student("a", 14, 60), 
          Student("b", 15, 80), 
          Student("a", 15, 70)
        ).sortBy(s => (s.age, s.score))
    

    输出:List(Student(a,14,60), Student(a,15,70), Student(b,15,80))

    将List相邻元素分组

    每相邻的10个元素分成一组:

    val list = (0 to 20).map(_.toString)
    list.zipWithIndex.map(t => t._1 -> ((t._2 / 10) * 10)).groupBy(_._2).toList.sortBy(_._1).map(_._2.map(_._1))
    

    输出:
    Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    Vector(10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
    Vector(20)

    取序列的第1个元素

    其中包含了判空逻辑。

    List(1, 2, 3).headOption.getOrElse(0)
    

    相关文章

      网友评论

        本文标题:酷炫的一行代码 - Scala就是这么任性!

        本文链接:https://www.haomeiwen.com/subject/ehbzuttx.html