【Scala】新手入门,基础语法概览
变量、常量和数据类型
var
var修饰的是变量,variable,值是可变的
var 变量名 [: 变量类型] = 变量值
scala> var age : Int = 23
age: Int = 23
scala> var age = 23 //这里的变量类型可以省略不写,scala会自行推断
age: Int = 23
scala> age = 25
age: Int = 25
scala> age
res1: Int = 25
val
val修饰的是常量,值是不可变的
val 常量名 [: 常量类型] = 常量值
scala> val sex : String = "男" //类似于java中的final
sex: String = 男
scala> val sex = "男"
sex: String = 男
scala> sex = "女"
<console>:12: error: reassignment to val //因为是常量,所以不能修改
sex = "女"
^
数据类型
和java一样,有7种数值类型:Byte,Char,Short,Int,Long,Float,Double和一种Boolean类型
scala中对大小写很敏感,一定要写对大小写
在scala中数据类型的本质是对象,可以调用对应的方法
scala> 1 + 1 //1 + 1的本质并非是数值相加
res2: Int = 2
scala> 1.+(1) //其实是1作为Int类型,在scala中是对象,可以调用+方法
res3: Int = 2
条件表达式
scala> val a = 1
a: Int = 1
scala> val b = if (a > 1) 1 else -1
b: Int = -1
scala> val b = if (a > 1) 1 else "allen"
b: Any = allen //此处的Any相当于java中的Object
scala> val b = if (a > 1) 1
b: AnyVal = () //此处的AnyVal是Any的直接子类
//以上的scala语句就相当于java中的if语句,不过要简便很多
int a = 1;
if (a > 1) {
a = 1;
} else {
a = Integer.parseInt("allen");
}
Any:是scala中所有类的超类/父类,相当于java中的Object
AnyRef:是所有引用类型的父类
AnyVal:是所有基本类型的父类
scala> val b = if (a > 1) 1 else "allen"
b: Any = allen
//以上的完整形式应该是
scala> val b = if (a > 1){
1
} else {
"allen"
}
b: Any = allen
所以scala语法比java更灵活,{}内如果只有一个表达式时,{}可以省略
而且支持混合类型表达式,比如上面1是Int类型,allen是String类型,最后输出为AnyVal类型
scala Unit:表示返回空值,相当于java中的void。Unit有一个唯一的实例 ()
块表达式
scala> val a = 1
a: Int = 1
scala> val b = {
| val c = a + 1
| val d = c * 3
| d}
b: Int = 6
scala> val b = {
| val c = a + 1
| val d = c * 3
| 12345}
b: Int = 12345
{}括起来的一段代码逻辑称为代码块。看上图,代码块执行的结果一直都是最后一个表达式的结果。
to循环
scala> 1 to 10
res6: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) //相当于java中的[1,10]
for循环
for (形式参数 <- 表达式|数组|集合)
scala> val a1 = Array(11,12,13)
a1: Array[Int] = Array(11, 12, 13)
scala> for(i <- a1) println(i)
11
12
13
scala> for(i <- a1) println(i * 10)
110
120
130
for推导式
scala> val a1 = Array(11,12,13)
a1: Array[Int] = Array(11, 12, 13)
scala> for (i <- a1) yield i * 10
res8: Array[Int] = Array(110, 120, 130)
将yield后面的表达式作用于for循环的结果,并返回构成一个新的集合
scala中的方法和函数
方法的定义
识别方法的重点是关键字def
def 方法名(参数名1:类型,参数名2:类型,...):返回类型 = {方法体}
注意事项:
1.针对返回结果类型,通常情况下可以不写,但是递归方法除外,需要制定返回类型
2.针对方法体,如果逻辑简单,{}可以省略
3.针对输入参数列表,如果是无参数输入,()可以不写
函数的定义
识别方法的重点是 =>
val 函数名称 = (参数1:类型,参数2:类型,...) => {函数体}
scala> val f1 = (x : Int,y : Int) => x + y
f1: (Int, Int) => Int = <function2>
scala> f1(1,2)
res0: Int = 3
注意事项:
1.如果没有常量或者变量引用,函数称之为匿名函数
2.函数体简单,{}可以省略不写
3.也可以定义无参数函数
函数和方法的区别
1.在函数式编程语言中,函数是头等公民
2.函数本身是对象,具有自己的方法
andThen apply compose toString
3.函数可以当成其他数据类型一样,作为参数传递给方法
4.通常情况下,使用匿名函数作为参数传递
scala> def m1(x : Int,y : Int) = x + y //普通方法,接受两个Int,返回一个Int
m1: (x: Int, y: Int)Int
scala> def m2(f:(x : Int,y : Int) => Int) = f(2,3)
<console>:1: error: ')' expected but ':' found. //定义格式错误
def m2(f:(x : Int,y : Int) => Int) = f(2,3)
^
scala> def m2(f:(Int,Int) => Int) = f(2,3) //函数式方法,接受一个参数,类型为函数
m2: (f: (Int, Int) => Int)Int //且要求是输入两个Int,返回一个Int的函数
scala> def f1 = (x : Int) => x + 1 //函数:接收一个Int,返回一个Int
f1: Int => Int
scala> def f2 = (x : Int,y : Int) => x + y //函数:接收两个Int,返回一个Int
f2: (Int, Int) => Int
scala> m2(f2) //f2符合m2的参数类型,就可以把函数作为参数传递给方法
res1: Int = 5
scala> m2((x:Int,y:Int)=>x+y) //以匿名的形式传递给方法
res3: Int = 5
5.方法可以转换为函数
scala> def m2(f:(Int,Int) => Int) = f(2,3)
m2: (f: (Int, Int) => Int)Int
scala> def m1(x:Int,y:Int)=x+y
m1: (x: Int, y: Int)Int
scala> m1 _
res4: (Int, Int) => Int = <function2>
scala> m2(m1 _)
res5: Int = 5
scala> m2(m1) //scala作了隐式转换,把方法变成了函数
res6: Int = 5
相当于:
scala> val f1 = m1 _
f1: (Int, Int) => Int = <function2>
scala> m2(f1)
res7: Int = 5
【Scala】新手入门,基础语法概览的更多相关文章
- Scala快速入门 - 基础语法篇
本篇文章首发于头条号Scala快速入门 - 基础语法篇,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干货,也欢迎关注我的 ...
- Scala简介及基础语法
一.scala简介 官网:https://www.scala-lang.org/ Scala语言很强大,集成了面向对象和函数式编程的特点. 运行在JVM(jdk). 大数据中为什么学习scala? s ...
- XML 新手入门基础知识(复制,留着自己看)
如果您是 XML 新手,本文将为您介绍 XML 文档的基础结构,以及创建构造良好的 XML 需要遵循的规则,包括命名约定.正确的标记嵌套.属性规则.声明和实体.您还可以从本文了解到 DTD 和 sch ...
- Scala快速入门-基础
HelloWorld 从HelloWorld开始,使用scala IDE编辑器. 新建scala project 新建scala object 编写HelloWorld run as scala ap ...
- Python新手入门基础
认识 Python 人生苦短,我用 Python -- Life is short, you need Python 目标 Python 的起源 为什么要用 Python? Python 的特点 Py ...
- XML 新手入门基础知识
XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识 ...
- react入门----基础语法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 新手mysql 基础语法
SELECT * from new; SELECT stuname FROM new; //查询某一列 SELECT DISTINCT stuname FROM new; //查询同一列中不同的值 S ...
- python入门-基础语法
一.变量 定义字符串要加单引号‘’ 变量命名规范: 变量名只能是字母.数字或下划线的任意组合 变量名的第一个字符不能是数字 变量名不能用关键字 变量名不要用中文 变量名不要太长,区分大小写 面就用单引 ...
随机推荐
- 别再问我 new 字符串创建了几个对象了!我来证明给你看!
我想所有 Java 程序员都曾被这个 new String 的问题困扰过,这是一道高频的 Java 面试题,但可惜的是网上众说纷纭,竟然找不到标准的答案.有人说创建了 1 个对象,也有人说创建了 2 ...
- python输出中文乱码
首选项-浏览插件目录-USER文件夹 找到编译环境设置,编译方式为UTF-8编码 { "cmd": ["c:/Python36/python.exe",&quo ...
- DPK
一.概念 dpk文件是Delphi的包文件,有dpk文件的组件安装比较方便.一般来说,支持不同版本Delphi的组件会有不同的dpk文件,一般以7结尾的dpk文件是支持Delphi 7的.如果没有支持 ...
- python干货:5种反扒机制的解决方法
前言 反爬虫是网站为了维护自己的核心安全而采取的抑制爬虫的手段,反爬虫的手段有很多种,一般情况下除了百度等网站,反扒机制会常常更新以外.为了保持网站运行的高效,网站采取的反扒机制并不是太多,今天分享几 ...
- 浏览器远程编写python代码--jupyter web server
公司分配了开发机,偶尔需要写一些python自动化脚本.为了提高编写效率,可以开发机上起一个jupyter web server,然后在电脑chrome浏览器进行编辑. 以下步骤均在开发机上操作. 安 ...
- 多窗体及窗体之间传值 以及listview的使用
三中打开窗口窗体状态: 1 messagebox.show 类型 特点: 从窗口form 1里打开另一个窗体form2,form2不关闭的情况下form1 不能操作:代码如下: private ...
- Stream—一个早产的婴儿
当你会关注这篇文章时,那么意味着你对Stream或多或少有些了解,甚至你在许多业务中有所应用.正如你所知,业界对Stream.lambda褒贬不一,有人认为它是银弹,也有人认为其降低了代码的可读性.事 ...
- 尾递归和JAVA
简单来说,递归即是调用自己本身.所有递归都应该有至少一个基本条件,在满足基本条件时不进行递归. 给出一个递归实例: int fact(int N){ if(N==1) return 1; else r ...
- spark 集群优化
只有满怀自信的人,能在任何地方都怀有自信,沉浸在生活中,并认识自己的意志. 前言 最近公司有一个生产的小集群,专门用于运行spark作业.但是偶尔会因为nn或dn压力过大而导致作业checkpoint ...
- HTML+CSS教程(五)外联样式、组选择器、圆角边框、样式优先级、伪类、盒子模型、元素溢出
一.外联样式 通过link标签引入外部css文件夹中的xxx.css文件到head标签中 例: 二. 1.组选择器 选择器名称1,选择器名称2,选择器名称3,…{属性:属性值;属性;属性值} 例: & ...