核心内容:
1、For进阶实战
2、Function(函数)进阶实战
3、Lazy关键字的使用
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、for进阶实战
(1)嵌套循环的使用
(2)for循环中加入条件表达式
示例程序:
object App
{
def main(args:Array[String])
{
//循环方式1
for(i<- 1 to 2)for(j<- 1 to 2)println(i+"\t"+j);
println;
//循环方式2
for(i<- 1 to 2;j<- 1 to 2) println(i+"\t"+j);
println;
//for循环中加入条件表达式
for(i<- 1 to 2;j<- 1 to 2;if(i!=j)) println(i+"\t"+j);
}
}
程序输出:
2、Function(函数)进阶实战
(1)函数是有数值的,因此函数的右侧一般都有一个等号,等号的右侧(执行体)表示如何对函数进行计算
(2)函数是有值的,即函数的执行必然有一个结果,因此函数可以作为函数的参数进行传递.
(3)函数是有值的,因此函数可以赋值给一个常量:当我们将一个函数赋值给一个常量的时候,我们可以通过常量(匿名参数表达式)来调用函数,并为常量进行赋值,
(4)匿名函数:在很多复杂的scala算法中,根本就不会给出函数的名字,因为我们只关心数据是如何进行计算的,而不关心函数的名字是什么.
(5)大多数情况下我们都不会声明函数返回值的类型,因为scala编译器会根据函数的执行体自动推断函数返回值的类型,但是递归函数在scala中必须声明函数返回值的类型.
(6)scala中的函数参数可以提供默认的数值
(7)scala中的函数参数个数是可变的,可以有任意多个
示例程序:
//有名函数和匿名函数
def add(x:Int,j:Int) = x + j;
println(add(10,20));
val aa = (x:Int,j:Int) => x + j;
//调用匿名函数
println(aa(10,20));
程序输出:
------------------
object App {
def main(args: Array[String]): Unit = {
println(combine("spark"));
println(combine("spark","<<",">>"));//默认的参数值可以被覆盖
}
//函数的形式参数可以提供默认的数值
def combine(content:String,left:String="[",right:String="]")=left + content + right;
}
程序输出:
-----------------------------------------------------
object App {
def main(args: Array[String]): Unit = {
println(connected(1,2));
println(connected(1,2,3));
}
//函数的形式参数是可变的,可以有任意多个
def connected(args:Int*)=
{
var result = 0;
for(arg <- args) result += arg;
result;
}
}
程序输出:
3、lazy关键字的使用
(1)被lazy修饰的某个变量或常量,只有在第一次被使用的时候,才会被实变量例化.
(2)当我们用lazy修饰某个变量或者常量的时候,这个变量或者常量就有一种延迟加载与延迟执行的行为,从而增大优化的范围与力度.
示例程序:
object App
{
def main(args:Array[String])
{
//(假设路径是不存在的,无lazy关键字)
val file = Source.fromFile("D:\\word2.txt");
}
}
程序输出:
当我们加入lazy关键字:
object App
{
def main(args:Array[String])
{
//(假设路径是不存在的,有lazy关键字)
lazy val file = Source.fromFile("D:\\word2.txt");
}
}
程序不会抛出异常。