zoukankan      html  css  js  c++  java
  • Scala入门(二)

    Scala学习笔记 -- 入门(二)

    7.参数化

    //值参数化
    val big = new java.math.BigInteger("12345")
    
    //类型参数化
    val greetStrings = new Array[String](3)
    greetStrings(0) = "Hello"
    greetStrings(1) = ", "
    greetStrings(2) = "world!
    "
    for (i <- 0 to 2)
    	println(greetStrings(i))
    

    Scala中使用new来实例化对象或类的实例,并通过用值或类型来对其参数化。参数化意思是在创建实例时对实例做“配置”。
    用值参数化,做法是在构造方法的括号中传入对象参数。用类型参数化,做法是在方括号里给出一个或多个类型。
    注意,当你同时使用类型和值来参数化一个实例时,先是方括号包起来的类型,然后才是圆括号包起来的值。
    greetString永远指向那个跟初始化时相同Array[String]实例,“可以”改变那个Array[String]元素,因此数组本身是可变的。
    Scala从技术上讲并没有操作符重载,因为它实际上并没有传统意义上的操作符,这些字符都可以被用作方法名。

    //apply方法调用
    val res = 1 + 2
    val res = (1).+(2)
    
    //update方法调用
    greetStrings(0) = "Hello"
    greetStrings.update(0, "Hello")
    

    数组是类的实例。
    用一组圆括号将一个或多个值包起来,并将其apply到某个对象时,Scala会将这段代码转换成对这个对象的一个名为apply的方法的调用。
    当通过圆括号应用了一个或多个参数的变量进行赋值时,编译器会将代码转换成对update方法调用,这个update方法接收两个参数:圆括号括起来的值,以及等号右边的对象。
    Scala将从数组到表达式的一切都当作带有方法的对象来处理。

    8.列表

    //创建初始化一个列表
    val oneTwoThree = List(1, 2, 3)
    
    //列表拼接
    val oneTwo = List(1, 2)
    val twoThree = List(2, 3)
    val threeFour = List(3, 4)
    val oneTwoThreeFour = oneTwo ::: threeFour
    
    val oneTwoThree = 1 :: twoThree
    // twoThree.::(1)
    
    val oneTwoThree = 1 :: 2 :: 3 ::Nil
    

    对于需要拥有相同类型的对象的不可变序列的场景,可以使用Scala的List类。
    “:::” => 列表拼接 ==> 创建并返回一个带有新值的新列表
    “::” => cons => 在一个已有列表的最前面添加一个新的元素,并返回这个新的列表。
    表示空列表的快捷方式是Nil。
    注:
    列表操作中,“:+” 追加操作所需时间随着列表的大小线性增加,而使用“::”在列表前面添加元素只需常量时间。

    9.元组

    val pair = (99, "Luftballons")
    println(pair._1)
    println(pair._2)
    

    元组可以容纳不同类型的元素。要实例化一个新的元组,只需要将对象放在圆括号中,用逗号隔开。元素的实际类型取决于它包含的元素以及元素类型。
    访问元组中元素不能像访问列表元素,其原因在于列表的apply方法永远只返回同一类型,但元组里的元素可以是不同类型的。

    10.集与映射

    Scala提供了两个子特质,一个用于表示可变集,一个用于表示不可变集。

    // 创建、初始化及使用不可变集
    var jetSet = Set("Boeing", "Airbus")
    jetSet += "Lear"
    println(jetSet.contains("Cessna"))
    
    //创建、初始化及使用可变集
    import scala.collection.mutable
    val movieSet = mutable.Set("Hitch" ,"Poltergeist")
    movieSet += "Shrek"
    println(movieSet)
    

    //创建 初始化及使用一个不可变HashSet
    import scala.collection.immutable.HashSet
    val hashSet = HashSet("Tomatoes" ,"Chilies")
    println(hashSet + "Coriander")
    
    //创建 初始化及使用一个可变映射
    import scala.collection.mutable
    val treasureMap = mutable.Map[Int, String]
    treasureMap += (1 -> "Go to island.")
    treasureMap += (2 -> "Find big X on ground.")
    treasureMap += (3 -> "Dig.")
    println(treasureMap(2))
    
    def formatArgs(args:Array[String]) = args.mkString("
    ")
    

    mkString方法可以被用于任何可被迭代访问的集合,返回一个包含了对所有元素调用toString的结果的字符串,以传入的字符串分隔。

    val res = formatArgs(Array("zero", "one", "two"))
    assert(res == "zero
    one
    two")
    

    Scala的assert方法检查传入的Boolean,如果是false,则抛出AssertionError。如果是true,assert就返回。

    11.文件操作

    //引入scala.io包中Source类
    import scala.io.Source
    def widthOfLength(s:String) = s.length.toString.length
    if(args.length > 0){
        /*
        toList是必需的,因为getLines()方法返回的是一个迭代器iteration,一旦完成遍历,迭代器就会被消耗掉。通过toList将它转化为List,即可通过内存存储所有行。
        */
        val lines=Source.fromFile(args(0)).getLines().toList
        /*
        reduceLeft方法将传入的函数应用到lines的头两个元素,然后继续将这个传入的函数应用到前一步得到的值和lines中的下一个元素,直到遍历完整个列表后,reduceLeft将返回传入函数的最后一次执行结果。
        */
        val longestLine = lines.reduceLeft(
        (a,b) => if (a.length > b.length) a else b
        )
        val maxWidth = widthOfLength(longestLine)
        for (line <- lines){
            val numSpaces = maxWidth - widthOfLength(line)
            val padding = " " *numSpaces
            println(padding + line.length + " | " + line)
        }
    }
    else
    Console.err.println("Please enter filename: ")
    
  • 相关阅读:
    java 第二次作业
    Java上机作业5.7
    Java上机作业4.30
    Java第八周作业
    上机作业4.23
    第七周作业
    4.16上机作业
    第六周作业
    Java上机作业4.9
    Java4.2上机作业
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/11983631.html
Copyright © 2011-2022 走看看