`

scala 一些知识整理

 
阅读更多

前言:

 

1 下载地址: www.scala-lang.org

2 这里下载的是 scala-2.11.1.msi, 本身就可以在window上运行,

安装时要指定最好不要将scala安装到带有空格的路径,否则可能在运行“scala”命令的时候报“此时不应有 \scala\bin\scala.bat)。”的错误提示。

3 关于 idea支撑scala的配置,见 idea 集成 maven和scala.note

4 使用版本介绍:

scala版本:2.10.4 后面的spark也对应的scala这个版本, 最新版本 2.12.3

idea版本 14.1.1 ideaIC-14.1.1.exe

maven 版本3.3.3

 

jdk版本: 1.7

 

scala默认导入的三个包:

import java.lang._

import scala._

import Predef._

 

scala思想都是对象,因此没有基本数据类型, scala比Java面向对象更彻底,没有基础类型, scala奇妙的地方, 一切都是对象

scala 集合collection分为可变和不可变两种,

scala.collection.mutable

scala.collection.immutable

 

其中,默认创建的集合都是immutable collection types ,里面的集合都是定长、

scala的变量和常量赋值介绍:

scala语法是弱类型类似于js

一个是变量类型

一个是数值类型

 

 

 

scala变量定义:

scala>var a = 1 类型会根据值自动推断

a: Int = 1

scala>var b = "hello" 类型会根据值自动推断, 注意只能是"" 不能是''

b: String = hello

 

常量定义:

scala>val c = 10 给常量复制后就不能再修改值了

c: Int = 10

 

在scala中是不允许只声明但是不给初始化赋值的, 如下例子,第一次只是定义了变量 a,但是没有赋值,在scala命令行中 var a 后会继续等待你输入,

 



 

scala 好玩的样子
scala> var a=5
scala> var b="hello"
scala> a + b
res4: String = 5 hello ----> scala中 允许*是一个方法名的, String类型有一个*的方法, 比如写成 b.*(a)
scala> b*a

 



 
 在命令行中执行 scala :
HelloWorld.scala文件, 执行方式:
1 先编译,在执行, scalac HelloWorld.scala scala HelloWorld
2 直接执行 scala HelloWorld.scala
 
在配置了window机器的环境变量后,命令行cmd重启,就会把path重新加载一次。
 
在定义null的时候,只能是对var 变量来定义。

 
scala中调用Java类时,默认的Scala只会编译 这里目录的文件
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
 
如果scala文件中调用Java类,那么 可以手动将 这个Java类放在上面路径下让被编译到。
 scala导包, 用_ 而不用* 比如写法如下:
import java.util.Arrays._
 
下面案例中 使用的 pom.xml如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ibeifeng.scala</groupId>
  <artifactId>scala_demo2</artifactId>
  <version>1.0-SNAPSHOT</version>
  <inceptionYear>2008</inceptionYear>
  <properties>
    <!-- 修改Scala的版本 -->
    <scala.version>2.10.4</scala.version>
  </properties>

  <repositories>
    <repository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>
  </pluginRepositories>

  <dependencies>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>
    <dependency>
      <groupId>org.specs</groupId>
      <artifactId>specs</artifactId>
      <version>1.2.5</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <sourceDirectory>src/main/scala</sourceDirectory>
    <testSourceDirectory>src/test/scala</testSourceDirectory>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
          <args>
            <arg>-target:jvm-1.5</arg>
          </args>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <downloadSources>true</downloadSources>
          <buildcommands>
            <buildcommand>ch.epfl.lamp.sdt.core.scalabuilder</buildcommand>
          </buildcommands>
          <additionalProjectnatures>
            <projectnature>ch.epfl.lamp.sdt.core.scalanature</projectnature>
          </additionalProjectnatures>
          <classpathContainers>
            <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
            <classpathContainer>ch.epfl.lamp.sdt.launching.SCALA_CONTAINER</classpathContainer>
          </classpathContainers>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
</project>
 
 
 

 

scala  Array知识点整理:

1 定义数组两个方式:
   var a = new Array[Int](3) , []中是数据类型(可以去掉),()中是数组长度 表示定义长度为3的一个数组
   var a = Array[Int](1,2,3,4)   不使用new定义数组时,[]中是数据类型(可以去掉),()中初始化数组的值,表示这个数组里值为 3,4,5,6

数组: Array
变长数组: ArrayBuffer

++= 是增加数组的 
--= 减少数组
定长数组.toBuffer 变长变长数组

数组是以下标0开始的  var a = ArrayBuffer(1,2,3,4)
变长数组增加字段:  a+=5  a.insert(1,11)
变长数组修改字段  a(0) = 0 
变长数组删除字段: a-=3  会直接将里面元素为3的删除掉

数组迭代:
var b = for(tmp <- a if(tmp%2==0)) yeild tmp
 b.foreach(println)
 
数组排序:
a.sorted


--------------------------------------------------------------------------------

for  break continue:

定义函数:
  def demo02(): Unit = {...} 注意Unit可以理解为void, 如果函数是要返回值的,def demo02(): Int = {...函数最后一行为返回值}



i <- a to b 表示范围    [a,b]  for循环  for(tmp <- 0 until length)
i <- a until b 表示范围  [a,b) for循环  

for的推导式: for(tmp <- a.reverse) 
for的守位:  for(tmp <- a.reverse; if tmp %2 == 0)     for(tmp <- 0 to (length,2)) 2表示步长 
for增加break :  var _break = new Breaks  _break.breakable {for循环{if(xxx){_break.break()}}}  _break.breakable需要整个包住for循环
for中的continue:  var _break = new Breaks  for循环{_break.breakable {if(xxx){_break.break()}}}  _break.breakable仅需要包住在要跳出的地方

--------------------------------------------------------------------------------


List :

定义的两种方式:
 var list1 = List(1,2,3,4)  或者 var list2 = 0::1::2::3::Nil   list2 = list2 :+ 4
var list1 =  new ListBuffer[Int] list1 += 1  


--------------------------------------------------------------------------------


元组:
// 元组定义, 里面可以有多个数值类型 , 在获取的时候 用 _1 _2 _3这种方式获取 并且下标从1开始
def test2(): Unit = {
  var p1 = ("hello", 33, 19)
  println(p1._1  )
}

--------------------------------------------------------------------------------

case match   +  模式匹配 

// 模式匹配的值匹配 增加首位_ 这个占位符
  def test3(): Unit = {
    val a = 3
    val b = a match{ // _可以理解为占位符,表示参数a有多个值的时候,那么用_表示多个 如果a就一个值 比如 4那么直接写出4即可
      case _ if a>=0 && a<4  => "小于4"
      case   4 =>"等于4"
      case _ => "大于4"
    }
    print(b)
  }

// 模式匹配的类型匹配
def test4(): Unit = {
  val num:Any="1"
  num match {
    case i:Int => println("this is Int")
    case s:String => println("this is String")
    case _ => print("this is not Int and String, is other")
  }

}


  // 数组的模式匹配
  def test5(): Unit = {
    val array = Array(1,2,3)

    array match {
      case Array(1,2) => println("Array(1,2)")
      case Array(1,2,_) => println("Array(1,2,_) 三个参数")
      case Array(1,2,_*) => println("Array(1,2,_*) 三个以上参数")
      case _ => print("不识别")
    }

  }

--------------------------------------------------------------------------------

map:
 
1 定义: var map1 = Map("zhangsan"->23,"lisi"->32)   map1.getOrElse("zhangsan1","no having")  
2 增加元素: map1+=("wangwu"->33)
3 删除元素: map1-=("zhangsan")
4 修改元素; map1("lisi")=40
5 遍历: for((k,v) <- map1) for(tmp <- map1) for( k <- map1.keys)  for( v <- map1.values) 

--------------------------------------------------------------------------------

自定义函数和集合的 map()方法使用,  

集合的map()方法就是将 集合中的每一个元素 打散后来一个个处理

1 自定义函数:
 def mytoupcase(a:String): String ={
    a.toUpperCase()
  }
  
  
  
    // 定义函数 可变参数,  *表示有多个参数
  def sum1(x:Int*): Int = {
    var c = 0
    for(a<-x) {
      c=c+a
    }
    return c // return 可以有 可以不写, 定义的函数中,最后一行表示返回值
  }


2 集合的map()方法 :  此方法会把集合的所有元素得到并进行处理
var list = List("a" ,"b","c")
var newList = list.map(_.toUpperCase) // _表示集合所有元素

// 隐式调用
var newList = list.map(mytoupcase)  //  调用集合的map函数,在函数中因为集合就一个个的元素,因此在传递给自定义函数mytoupcase时直接省略传参
// 显示调用 
var newList = list.map(tmp => mytoupcase(tmp))


 // 定义函数,实现字母大写
  def mytoupcase(a:String): String ={
    a.toUpperCase()
  }

--------------------------------------------------------------------------------

集合rededuce() 方法 :

 // reudceleft : 集合元素从左到右 依次按照函数来操作, 从左向右进行聚合 (聚合:多个值变成一个值)
  def test1() : Unit ={
   // var result = List(1,2,3,4,5).reduceLeft(_-_) // 匿名函数, 左边数字 - 右边数字
   var result = List(1,2,3,4,5).reduceLeft((x,y)=>x-y)
    println(result)
  }

 

 

 

 

  • 大小: 5.3 KB
  • 大小: 6.5 KB
分享到:
评论

相关推荐

    scala学习笔记整理

    在"scala学习笔记整理"中,我们可以深入探讨以下关键知识点: 1. **基础语法**:Scala的基础语法与Java有相似之处,但也有很多独特的特点。例如,它支持变量的不可变性(immutability),使用`val`声明常量,`var`...

    最新整理的大数据scala和spark视频教程

    这份“最新整理的大数据scala和spark视频教程”为想要深入理解和掌握这两个工具的学习者提供了宝贵的资源。 Scala(Scalable Language)是一种多范式编程语言,融合了面向对象和函数式编程的特性。它由Martin ...

    Scala入门教程_中文版整理

    ### Scala入门教程知识点详解 #### 一、Scala简介 Scala是一种多范式的编程语言,它融合了面向对象编程和函数式编程的特点。由于Scala运行在Java平台上,因此它能够充分利用Java平台的优势,如丰富的库资源、强大...

    scala学习笔记

    根据提供的文件信息,我们可以整理出一系列关于 Scala 编程语言的关键知识点。这些知识点将涵盖从基本语法到高级特性,帮助初学者快速理解 Scala 的核心概念和技术。 ### 1. 数据类型与变量 - **基本数据类型**:...

    scala by examples

    以下是基于提供的内容进行整理的知识点。 1. 面向对象与函数式编程的结合:Scala语言成功地将面向对象编程的特性与函数式编程的特性融合在一起,允许程序员在同一个程序中既采用面向对象的风格,也采用函数式编程的...

    Scala_2.7.6_API_离线精简2009.0915_By_ScalaCn.com

    这个精简版的API文档可能是为了方便用户快速查找和了解Scala的核心概念,而对大量信息进行了筛选和整理。 该压缩包包含四个部分(part01到part04),这可能是因为原始文件大小超过了单个RAR文件的限制,所以被分成...

    Manning Early Access Program Functional Programming in Scala 10

    由于您提供的文件内容是关于Scala中函数式编程的书籍《Functional Programming in Scala》的MEAP(Manning Early Access Program)版,我将以此为基础,生成相关的知识点。 首先,《Functional Programming in ...

    软著申请代码整理软件.zip

    计算机软件著作权(软著)是保护开发者知识产权的重要方式,它证明了您对某软件的原创性。在申请软著的过程中,通常需要提交源代码作为证据,以展示软件的设计与实现。"软著申请代码整理软件.zip" 是一个专门用于...

    scalaQuery18情况总结代码

    这个“scalaQuery18情况总结代码”很可能是一个开发者在学习和使用ScalaQuery v1.8版本时所做的笔记和示例集合,经过两天的学习、实践和调试后整理出的成果。 在ScalaQuery中,主要的知识点包括: 1. **基本概念**...

    Spark面试【梅峰谷】系列整理

    在 Spark 面试中,需要掌握的知识点包括 Scala 语言基础、Spark 内部机制、调度模式等。 Scala 语言基础 1. Scala 中 private 与 private[this] 修饰符的区别 private 修饰符将字段设置为类私有, Scala 会自动...

    Spark-Core学习知识笔记整理

    Spark-Core文档是本人经三年总结笔记汇总而来,对于自我学习Spark核心基础知识非常方便,资料中例举完善,内容丰富。具体目录如下: 目录 第一章 Spark简介与计算模型 3 1 What is Spark 3 2 Spark简介 3 3 Spark...

    scallot:Scala HTTP Bot 解析网页中的嵌入视频

    这个工具可能是为了帮助用户从各种网站抓取并整理出视频资源的链接,便于下载或进一步分析。HTTP Bot 指的是使用 HTTP 协议爬取网络数据的程序,通常用于 web 爬虫或数据抓取任务。 **描述分析:** 描述中的“扇贝...

    电影推荐系统 适用于初学者

    1. **数据预处理**:在构建推荐系统之前,需要对原始数据进行清洗和整理,这包括去除重复项、填充缺失值、格式转换等步骤,以确保数据的质量和可用性。 2. **数据存储与管理**:通常,推荐系统会涉及到大量的电影和...

    大数据学习笔记,学习路线,技术案例整理。.zip

    1. **基础知识**:首先,你需要熟悉计算机科学基础,如数据结构、算法和编程语言(如Java、Python或Scala)。这些是处理大数据的基础。 2. **大数据框架**:深入理解Hadoop生态系统,包括HDFS、MapReduce、YARN等。...

    大数据面试题整理.docx

    【大数据面试题整理】 在大数据领域,面试通常会涵盖各种技术,如Hadoop、Spark、Flink、Java、Scala、HBase、Flume、Hive、Kafka、Zookeeper、Redis、MySQL、MongoDB、Linux、Sqoop和Oracle。这些技术在大数据处理...

    软件开发应知应会 试题答案整理.docx

    以下是一些主要的知识点: 1. 数据结构:栈和队列是两种基本数据结构。栈是后进先出(LIFO)结构,而队列是先进先出(FIFO)结构。在顺序表中插入元素时,如果是在第 i 个位置,需要将后面的 n-i+1 个元素向后移动...

    spark考试练习题含答案.rar

    为了帮助大家深入理解和掌握Spark的核心功能,我们整理了一系列的Spark考试练习题,涵盖从基础概念到高级应用的全方位知识点。这份资料包含两部分:《spark练习题含答案01.docx》和《spark练习题含答案02.docx》,...

    spark面试题整理.pdf

    ### Apache Spark面试题知识点解析 #### 一、基础知识(1-20) 1. **Apache Spark简介及其与Hadoop的区别** - **Apache Spark**是一个快速、通用且可扩展的大数据分析平台,支持大规模数据处理需求。它采用了内存...

    spark-rdd-APi

    本文档将基于Scala语言中的RDD实现代码源码进行知识点的整理与解释。 描述:“内容根据Spark RDD.scala和ParRDDFunctions.scala源码中RDD顺序整理,包含RDD功能解释。对熟悉Spark RDD很有用。”表明本文档涉及的是...

Global site tag (gtag.js) - Google Analytics