注意:Scala系列的文章需要一定的java基础
Scala底层是用java语言编写的,scala是运行在Java虚拟机(JVM)上的编程语言,它兼容Java,可以直接调用Java的库和框架,并与Java代码无缝集成和互操作。
如果java没有基础的,可以看看在下java专栏的文章^_^,链接如下:
http://t.csdnimg.cn/FkJlt
一、HelloWorld
/**
* def:定义函数或者方法的关键字
* main:函数名 main函数是被jvm(java虚拟机)所特有识别的程序入口
* args:参数名
* Array[String]:参数的数据类型
* Unit:返回值类型 相当于java中的void
*
* scala:def main(args: Array[String]): Unit = {}
* 等价于
* java:public static void main(String[] args)
*/
object HelloWorld {
def main(args: Array[String]): Unit = {
//在scalaz中也可以使用Java语法输出hello world
System.out.println("hello world")
//使用scala自己的语法输出hello world
println("hello world")
}
}
注意:
1、scala代码中可以使用Java的类和方法
2、scala代码中一行语句的结束不需要加分号
3、class是一个普通的类,不能直接编译运行,object相当于一个单例对象,object类中的方法相当于加上一个static关键字,意味着object类中的方法可以直接调用
参数理解:
def:定义函数或者方法的关键字
main:函数名 main函数是被jvm(java虚拟机)所特有识别的程序入口
args:参数名
Array[String]:参数的数据类型
Unit:返回值类型 相当于java中的void
二、Scala中基本数据类型:
三、Scala中变量的使用
在scala中,可以使用val或者var来定义变量
定义一个变量: var
定义一个常量: val 常量值无法被改变
定义一个变量或常量的标准语法:var/val 变量名:数据类型 = 值
scala提供一种自动数据类型推断机制,数据类型可以省略不写
/**
* scala与java中基本数据类型:
* scala: java:
* Byte byte
* Short short
* Int int
* Long long
* Float float
* Double double
* Boolean boolean
* Char char
*/
object DataTypes {
def main(args: Array[String]): Unit = {
/**
* 定义一个变量: var
* 定义一个常量: val 常量值无法被改变
* 定义一个变量或常量的标准语法:var/val 变量名:数据类型 = 值
* scala提供一种自动数据类型推断机制,数据类型可以省略不写
*/
var a1: Int = 19
a1 = 29
println(a1)
//获取数据类型
println(a1.getClass) //int
val a2: Double = 19.03
//a2 = 29 报错原因:常量值无法被改变
println(a2.getClass)
/**
* 字符串:String
* 1.scala中的String与java中的String指的是同一个,java中String类的方法在scala中都可以使用
* 2、scala和java是互相兼容的
* */
//字符串切分:
val c2: String = "wo,xiang,qu,kan,xu,song,de,yan,chang,hui"
val strings: Array[String] = c2.split(",")
println(strings(0)) //wo 注意scala中使用索引取值用(),java中使用的是[],但它们的索引都是从0开始
println(strings(4), strings(5)) //(xu,song)
//字符串拼接:
//方式1:使用+拼接
val c3: String = strings(0) + "*" + strings(1) + "*" + strings(2)
println(c3)
//方式2:使用StringBuffer或StringBuilder加append方法
val c4: StringBuffer = new StringBuffer()
c4.append(strings(0))
.append("*")
.append(strings(1))
.append("*")
.append(strings(2))
println(c4)
//方式3:利用scala中的mkString方法
val c5: String = strings.mkString("*") //底层还是使用StringBuilder拼接字符串
println(c5) //wo*xiang*qu*kan*xu*song*de*yan*chang*hui
//方式4:插值表达式
/**
* scala中, 可以使用插值表达式来定义字符串, 有效避免大量字符串的拼接
* 格式:val/var 变量名[:String] = s"${变量/表达式}字符串"(s可以换成f,效果相同)
*/
val c6 = s"${strings(0)}*${strings(1)}*${strings(2)}" //wo*xiang*qu 底层还是使用StringBuilder拼接字符串
println(c6)
}
}
四、if...else和for循环
import java.util.Scanner
/**
* 流程控制:顺序结构 选择结构 循环结构
*/
object FlowControl {
def main(args: Array[String]): Unit = {
//选择结构之if...else
val sc: Scanner = new Scanner(System.in)
println("请输入你的考试成绩:")
val score: Int = sc.nextInt()
if (score < 60) { //引用变量、方法等不需要再后面加数据类型
println("真遗憾你挂科了!哭")
} else {
println("恭喜你没有挂科!笑")
}
/**
* 注意:
* 1、scala语法中没有++或--
* 2、scala中for循环的格式与java有很大的区别
* 3、scala中泛型使用的是[],java中使用的是<>
*/
//创建一个数组
val arr1: Array[String] = Array("java", "scala", "spark", "flink")
//使用for循环遍历数组
for (e <- arr1) {
println(e)
}
//使用while循环
var i: Int = 0
while (i < arr1.length) {
println(arr1(i))
i += 1
}
//scala的for循环中to与unitl的区别
//to:[]左闭右闭
for (e <- 1 to 10) {
println("hello world") //10个
}
println("*"*50)
//until:[)左闭右开
for (e <- 1 until 10) {
println("hello world") //9个
}
}
}
五、if与for
1、if
/**
* 在scala中,跟Java不同,条件表达式(if)是有返回值的,所以可以将它赋值给变量
*/
val sc: Scanner = new Scanner(System.in)
println("请输入你的考试成绩:")
val score: Int = sc.nextInt()
if (score < 60) { //引用变量、方法等不需要在后面加数据类型
println("真遗憾你挂科了!哭")
score
} else {
println("恭喜你没有挂科!笑")
}
println("你的成绩是:"+score)
注意:在scala中,跟java不同,条件表达式(if)可以有返回值
2、for
/**
* 注意:
* 1、scala语法中没有++或--
* 2、scala中for循环的格式与java有很大的区别
* 3、scala中泛型使用的是[],java中使用的是<>
*/
//创建一个数组
val arr1: Array[String] = Array("java", "scala", "spark", "flink")
//使用for循环遍历数组
for (e <- arr1) {
// println(e)
}
//使用while循环
var i: Int = 0
while (i < arr1.length) {
// println(arr1(i))
i += 1
}
//scala的for循环中to与unitl的区别
//to:[]左闭右闭
for (e <- 1 to 10) {
// println("hello world") //10个
}
println("*" * 50)
//until:[)左闭右开
for (e <- 1 until 10) {
// println("hello world") //9个
}
六、IO
java读写文件和scala读文件的方式(scala没有写数据的方式)
import java.io.{BufferedReader, BufferedWriter, FileReader, FileWriter}
import scala.io.{BufferedSource, Source}
/**
* 读取文件:
* 1、java方式
* 2、scala方式
*/
object IO {
def main(args: Array[String]): Unit = {
//1、java方式读取,写入数据
//字符缓冲流读取文件
val br = new BufferedReader(new FileReader("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi"))
//字符缓冲流写入新文件(默认是覆盖)
val bw = new BufferedWriter(new FileWriter("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi_new"))
var line: String = br.readLine()
while (line != null) {
bw.write(line)
bw.newLine() //写一个换行符
line = br.readLine()
bw.flush()
}
//释放资源
bw.close()
br.close()
//2、scala方式读取数据,scala没有写数据的方式
val reder: BufferedSource = Source.fromFile("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi_new")
val lines: Iterator[String] = reder.getLines() //获取该文件的所有数据
for(e<-lines){
println(e)
}
}
}