大数据---------spark体系之分布式计算---------scala分布式编程开发语言----------scala初始/类和对象(01,02,03)

问题集锦

01


正文

01scala与spark 

  scala是spark内核的实现语言,版本对应是这样的spark1.6 对应 scala 2.10实际上scala的更高版本也是可以的。spark1.6需要运行在java1.7上,python2.6上。java1.6到java1.7增添了maven包管理器,java1.7到java1.8增加了lamda表达式。

02 scala与java

scala也是基于jvm的,需要编译为字节码 .class文件,然后运行在jvm上。

scala既是面向对象又是面向函数的(对象和函数都可以被作为参数进行传递)。函数即java中的方法,在java1.8中也可以面向函数(匿名内部类)。

03 官网scala-long.org关于scala六大特性的说明。

第一个特性,由于scala和java都是基于JVM的,scala和java无缝整合,可以互相调用类。但是不可以同时混用两种语言。

第二个特性,类型推断,很想JavaScript,只有两种变量var和val var是用来定义变量,val是用来定义常量。其中val用的更多,因为jvm的回收机制gc可以把不常用的val变量回收。所以尽可能的定义val变量,如果是变量不需要显式定义,因为scala可以类型推断。

第三个特性,分布式和并发性。scala中有actor这种通信模型类似thread,可以支持在多台机器上的单进程多线程的通信。

第四个特性,traits结合了java中的抽象类和接口的特点。既可以多继承也可以多实现。方法也可以有方法体,变量也可以定义。

第五个特性,模式匹配,类似于switch

第六个特性, 高阶函数 就是可以将函数作为参数传递给函数。scala中函数和方法的区别很小。

 04 环境配置和创建初级项目

略  项目的创建步骤如下:选择创建新项目,选择scala ,选择scala的sdk 就可以了。

05 数据类型的描述

    基本数据类型是靠类型推断,不需要进行显式定义。以下主要介绍scala与java不同的地方。

    unit 这个代表无和void很像,比如作为函数的返回值

     nothing这个数据类型是所有类型的子类,当scala推断不出来变量的类型的时候它就用nothing来代替。是类型推断的辅助,不可以new nothing。

    any  所有类型的父类,所有的实例都是any类型,理论上基于jvm的语言都有一个所有类型的父类,object,实际上object也是any的父类。

    anyRef 所有引用类型的父类。

    anyvar 所有值类型的父类,比如double  ,1000.

    None 是option的子类之一,代表没有值,比如map中通过关键字a找到的对应的值是没有值,则返回None。用于函数的安全返回值。

     Nil 长度为0的List。

05 创建一个一般的scala工程

     步骤 创建一个新的工程,选择scala,然后选择idea,然后点击完成。

             new一个包  new一个Object (在idea中new 一个object的方法详见这片博客https://blog.csdn.net/wi8ruk48/article/details/88666660)。

            当然也可以new一个scala.class文件。

   06 基本的scala练习:

package com.bjsxt.scala

import java.util.Date

/**
  * 问题集锦
  * 1.Person类中的showname方法的定义中为何有一个等于号。def showname()={} main方法中也有,而this方法中没有
  *  解释 :  * 知识点9.定义方法的“=”可以省略,如果省略了“=”,那么最后一行的执行结果将会被丢弃,返回unit
  *2.到底在何种情况下使用var 函数的返回值也用val接收,这样合理吗
  */

/**
  * 以下几点都与java有所不同。
  * 1.在scala的object中定义的变量和方法都是静态的。object不可以传递参数,trait也不可以传递参数。object 不需要用new,直接用名字.成员即可。
  * 2.scala有分号推断机制
  * 3.给函数或者类定义参数需要指定类型。
  * 重点: 4.类中默认含有有参数的构造方法,但是这个默认的构造方法和java不同,它的参数和类的参数相同,定义一个实例时就会调用类中默认的构造方法。类中的属性默认就有getter,setter方法。
  * 5.new 一个对象的时候除了一般方法不执行外,其他的都执行。
  * 6.静态的object先加载。
  * 7.scala中如果一个类的名称和object的名称相同,那么称这个类为这个object的伴随类,这个object为这个类的伴随对象,他们之间可以互访私有变量。同一个包中不能含有同名的类。
  * 8.如果方法体的最后一行的计算结果当做返回值返回,那么return可以省略,如果return不省略,那么方法的返回值类型不可以省略。
  * 9.定义方法的“=”可以省略,如果省略了“=”,那么最后一行的执行结果将会被丢弃,返回unit
*/
class Person(Xname:String,Xage:Int){
  val name = Xname
  var age = Xage
  var gender = 'm'
  println("************")
  /**
    * 重写构造
    */
  def this(Yname:String,Yage:Int,Ygender:Char){
    this(Yname,Yage);
    this.gender = Ygender;
  }
  def showHello()={
    println("helloworld"+" "+Lesson_ObjAndClass.score)
  }
}

object Lesson_ObjAndClass {
  println("==========")
  val score = 200
  def main(args: Array[String]): Unit = {
   /* val person = new Person("zhangsan",18)
    person.age = 18
    println(person.gender)

    val p1 = new Person("diaochan",20,'f');
    println(p1.gender)
    p1.showHello()
    */


    /**
      * scala中的for循环
      * 1 to 10 这种写法是scala中的操作符操作
      */
    println(1 to 10)//包括10
    println(1 until 10)//不包括10
    println(1 to (10,2))
    println(1 to (10,3))
    println(1 to (20,5))
    for(i <- 1 to 10){ //这里的<-的意思是赋值给i
      println(i)
    }
    for(i<-1 to 10){
      for(j <- 1 to 10){
        println("i = " + i+" " + "j = " + j)
      }
    }
    for(i <- 1 to 10;j <- 1 to 10){//这是双重循环的另外一种写法。
      println("i = " + i +" " + "j = " + j)
    }
    val list1 = for(i <- 1 to 100 if(i%100==0)) yield i//这里用yield关键字的作用是把符合结果的值放进集合中,这个集合的名字是list1,具体类型是vector

    list1.foreach(x=>{   // 这里的foreach相当于加强for循环,而=>则相当于lamda表达式,而{}则相当于匿名函数。x 在这里相当于把集合list1中的每个元素取出来赋值给x,然后把x赋值给匿名函数。
      println(x)
    })
    list1.foreach(println(_))//如果list1中的值只需要出现一次(如果方法体可以用一行搞定,那么可以用下划线来代替),那么可以用下划线来代替
 }
}

   

    


猜你喜欢

转载自blog.csdn.net/wi8ruk48/article/details/88648618