一、Scala编程的特点
Scala是基于Java发展起来的,也拥有面向对象的特点,并且比Java更加面向对象,同时它还借鉴了函数式编程语言的一些特点。在 Scala 中函数式编程和面向对象编程完美融合在一起了。
1.面向对象编程
解决问题,分解对象,行为,属性,然后通过对象的关系以及行为的调用来解决问题。
对象:用户
行为:登录、连接 JDBC、读取数据库
属性:用户名、密码
Scala 语言是一个完全面向对象编程语言。万物皆对象
对象的本质:对数据和行为的一个封装
2.函数式编程
解决问题时,将问题分解成一个一个的步骤,将每个步骤进行封装(函数),通过调用这些封装好的步骤,解决问题。
例如:请求->用户名、密码->连接 JDBC->读取数据库
Scala 语言是一个完全函数式编程语言。万物皆函数。
函数的本质:函数可以当做一个值进行传递
二、函数式编程基础
1.函数基本语法
2.函数和方法的区别
(1) 核心概念
函数:为完成某一功能的程序语句的集合,称为函数。
方法:类中的函数称之方法。
(2) 函数和方法的区别
1.Scala 语言可以在函数内部声明函数,为了区分,一般把类中的函数称为方法,是广义上的函数,把方法中的函数称为函数,是狭义上的函数
2.函数没有重载和重写的概念;方法可以进行重载和重写
3.函数参数
(1)可变参数,参数类型后加*号表示可变参数
(2)如果参数列表中存在多个参数,那么可变参数一般放置在最后
(3)参数默认值,一般将有默认值的参数放置在参数列表的后面
(4)带名参数,调用函数时直接使用带名参数赋值就不需要按顺序传递参数了
object TestFunction {
def main(args: Array[String]): Unit = {
// (1)加*号表示可变参数
def test( s : String* ): Unit = {
println(s)
}
// 有输入参数:输出 Array
test("Hello", "Scala")
// 无输入参数:输出 List()
test()
// (2)如果参数列表中存在多个参数,那么可变参数一般放置在最后
def test2( name : String, s: String* ): Unit = {
println(name + "," + s)
}
test2("jinlian", "dalang")
// (3)参数默认值
def test3( name : String, age : Int = 30 ): Unit = {
println(s"$name, $age")
}
// 如果参数传递了值,那么会覆盖默认值
test3("jinlian", 20)
// 如果参数有默认值,在调用的时候,可以省略这个参数
test3("dalang")
// 一般情况下,将有默认值的参数放置在参数列表的后面
def test4( sex : String = "男", name : String ): Unit = {
println(s"$name, $sex")
}
// Scala 函数中参数传递是,从左到右
//test4("wusong")
//(4)带名参数
test4(name="ximenqing")
} }
4.函数至简原则(重点)
// 函数至简原则
object Test04_Simplify {
def main(args: Array[String]): Unit = {
def f0(name: String): String = {
return name
}
println(f0("atguigu"))
println("==========================")
//(1)return可以省略,Scala会使用函数体的最后一行代码作为返回值
def f1(name: String): String = {
name
}
println(f1("atguigu"))
println("==========================")
//(2)如果函数体只有一行代码,可以省略花括号
def f2(name: String): String = name
println(f2("atguigu"))
println("==========================")
//(3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)
def f3(name: String) = name
println(f3("atguigu"))
println("==========================")
//(4)如果有return,则不能省略返回值类型,必须指定
// def f4(name: String) = {
// return name
// }
//
// println(f4("atguigu"))
println("==========================")
//(5)如果函数明确声明unit,那么即使函数体中使用return关键字也不起作用
def f5(name: String): Unit = {
return name
}
println(f5("atguigu"))
println("==========================")
//(6)Scala如果期望是无返回值类型,可以省略等号
def f6(name: String) {
println(name)
}
println(f6("atguigu"))
println("==========================")
//(7)如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加
def f7(): Unit = {
println("atguigu")
}
f7()
f7
println("==========================")
//(8)如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略
def f8: Unit = {
println("atguigu")
}
// f8()
f8
println("==========================")
//(9)如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略
def f9(name: String): Unit = {
println(name)
}
// 匿名函数,lambda表达式
(name: String) => { println(name) }
println("==========================")
}
}