zoukankan      html  css  js  c++  java
  • spark笔记3

    scala入门

    1. 基础语法

    • 标识符区分大小写
    • class 名称首字母需大写
    • 方法名称首字母需小写
    • 程序文件名称需与 object 名称相同
    • main 方法是 Scala 程序的入口,每个 Scala 程序都必须定义此方法。
    • 标识符
      在 Scala 中标识符只能包括字符、数字和下划线,并且只能以字符和下划线开头,如:name、_value、test_1等等。
    • 混合标识符
      混合标识符由一个字符数字标识符、下划线和一个运算标识符组成,比如:unary_+、var_=。在这里,unary_+定义了一个一元+运算符,myvar_=用来作为方法名称定义了一个赋值运算符。
    • 文字标识符
      用``符号包含任意字符都是文字标识符

    2. 数据类型

    类型与java相同,占用的内存空间和精度也都一样
    但是目测在java里面是没有这些的

    类型 描述
    Unit 表示没有值
    Null 空或空引用
    Nothing 每一个其他类型的子类型,包括无值
    Any 任何类型的超类型,任何 object 都是 Any 类型的
    AnyRef 任何引用类型的超类型
    • 变量和常量
      var声明变量,使用val声明值(也就是常量)

    3. 函数定义和使用

    一般定义

    函数通过def定义,在 Scala 中,需要为函数参数指定类型签名,具体的格式如下

    def functionName ([list of parameters]) : [return type] = {
       function body
       return [expr]
    }
    

    无参函数

    如果函数不带参数,调用的时候可以不写括号,函数体中的语句如果只有一条表达式,可以省略函数的大括号
    记录一下操作过程

    • 函数的部分应用
      这是用下划线来实现的,是一个和以往学过的语言很不一样的一个特点

    你可以使用下划线_部分应用一个函数,结果将得到另一个函数。Scala使用下划线表示不同上下文中的不同事物,你通常可以把它看作是一个没有命名的神奇通配符。在{ _ + 2 }的上下文中,它代表一个匿名参数。你可以部分应用参数列表中的任意参数,而不仅仅是最后一个。你可以这样使用它

    def add(x: Int, y: Int) :Int = {
        return x + y
    }
    var add1 = add(1, _:Int)
    var add2 = add1(2)
    println(add2)
    

    效果是这样的,第一次调用add的时候后面那个参数用下划线来替代掉了

    柯西化函数

    现在我理解这个就是说这个有多个括号,每个括号里面是一个参数和其类型注解

    可变长度参数

    同一个类型的函数参数,个数是可变的,至少一个
    这个例子是把输入的单词变成大写

    // 把所有单词改为首字母大写
    def capitalizeAll(args: String*) = {
        args.map { arg =>
            arg.capitalize
        }
    }
    var str = capitalizeAll("hello", "world")
    println(str)
    

    4. 类

    在类中用def定义方法用val定义字段值

    类的构造方法

    这个课里面讲的构造函数,应该就是在实例化对象的时候给类方法传递参数,和java不一样的是类体里面不需要指明一个名字是类名的方法
    这是一个展示scala“面向表达式”的例子,对color的blue、black、white的赋值都是绑定在表达式上面的

    class Calculator(brand: String) {
        /**
         * 一个构造函数
         */
        val color: String = if (brand == "shiyanlou") {
            "blue"
        } else if (brand == "hello") {
            "black"
        } else {
            "white"
        }
    
        // 实例方法
        def add(m: Int, n: Int): Int = m + n
    }
    

    类的继承

    继承的关键字和java一样也是extends但是后面接的父类名字后面是带括号的

    方法重载

    上面那个科学计算器类,里面的log方法,在下面的这个例子里面被重载
    试了原来的color属性,双参数的log方法,以及新的重载的那个方法

    抽象类的继承

    5. 特质

    特质(Traits)是一些字段和行为的集合,可以扩展或混入(mixin)你的类中。不同于类继承,class 可以扩展多个 Traits。
    通过 with 关键字,一个类可以扩展多个特质

    但是让一个类拥有特质的办法还是extends,只不过extends后面可以加多个特质
    几个特质之间要用with来连接

    6. 集合

    Scala 提供了丰富的集合库,包括:列表(List)、集合(Set)、映射(Map)、选项(Option)、元组(Tuple)

    set和list的话,最直观的结果是这样的

    而immutable的意思是永恒不变的,但是并不能帮助我在字面意思上理解set和list的不同,还是等具体实践操作吧
    map映射的话,是这样用的

    用括号括起来就是元组,不禁让人联想起来数据库里面关系模式什么的

    选项option的话我理解这个字面是什么意思,但是没有搞清楚这个操作是在干什么

    查了人家的博客,好像是说,Scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。
    在没有值的时候,使用None,这是Option的一个子类。如果有值可以引用,就使用Some来包含这个值。
    Some也是Option的子类

    Option类型的值通常作为Scala集合类型(List,Map等)操作的返回类型。比如Map的get方法。Option有两个子类别,Some和None。当程序回传Some的时候,代表这个函式成功地给了你一个String,而你可以透过get()函数拿到那个String,如果程序返回的是None,则代表没有字符串可以给你

    参考资料

    Scala 技术笔记之 Option Some None

  • 相关阅读:
    解决Linux下gets函数警告
    freopen文件操作后控制台输入输出
    Linux C编程下没有 itoa()函数的问题
    codeforces 631A Interview
    codeforces 617BChocolate
    codeforces 630KIndivisibility(容斥原理)
    codeforces 633B A Trivial Problem
    codeforces 624B Making a String
    codeforce 621A(水题)
    codeforces 624A Save Luke(水题)
  • 原文地址:https://www.cnblogs.com/ltl0501/p/12107496.html
Copyright © 2011-2022 走看看