1.for循环是一个循环控制结构,可以有效地编写需要执行的特定次数的循环。Scalar的循环说明如下的各种形式:

1)Scala中for循环最简单的语法是:

  for( var x <- Range ){
  statement(s);
  }   在这里,范围可能是一个数字范围,并且表示为i到j或有时像i到j左箭头 < - 操作者被称为生成器,这样命名是因为它是从一个范围产生单个数值。 2)for循环中,循环将遍历给定范围内的所有可能的计算,可以使用分号 (;) 分隔多个范围。下面是使用两个范围的例子,也可以使用两个以上的范围
object Test {
def main(args: Array[String]) {
var a = 0;
var b = 0;
// for loop execution with a range
for( a <- 1 to 3; b <- 1 to 3){
println( "Value of a: " + a );
println( "Value of b: " + b );
}
}
}

3)for 循环使用过滤器

Scala for循环允许过滤出使用一个或多个某些元素if语句(多个)。以下是对用于沿使用过滤器循环的语法。

for( var x <- List
if condition1; if condition2...
){
statement(s);
}

要添加多个过滤器到一个for表达式,分离过滤用分号(;)。

例子:

以下是for循环使用滤器的例子:

object Test {
def main(args: Array[String]) {
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10); // for loop execution with multiple filters
for( a <- numList
if a != 3; if a < 8 ){
println( "Value of a: " + a );
}
}
}

4)for循环采用yield:

可以从存储中返回for循环中的变量的值,也可以通过函数返回。要做到这一点,可以通过关键字yield前缀的for表达式体,如下所示:

var retVal = for{ var x <- List
if condition1; if condition2...
}yield x

注意在大括号已被用来保持变量和条件以及retVal的是其中x的所有值将被储存在收集的形式的变量。

例子:

以下为例子,说明了for循环及yield的用法:

 
 
object Test {
def main(args: Array[String]) {
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10); // for loop execution with a yield
var retVal = for{ a <- numList
if a != 3; if a < 8
}yield a // Now print returned values using another loop.
for( a <- retVal){
println( "Value of a: " + a );
}
}
}

2.Function(函数):基本定义,匿名函数,递归函数,参数必须设置类型

  

1)Scala函数定义有如下形式:

def functionName ([list of parameters]) : [return type] = {
function body
return [expr]
}

在这里,返回类型可以是任何有效的scala数据类型,参数列表将是用逗号和参数,返回值类型列表分离变量是可选的。非常类似于Java,一个返回语句可以在函数表达式可用情况下返回一个值。以下是这将增加两个整数并返回的函数:

object add{
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b return sum
}
}
 package first.scala

 object For_Function_Advanced {

   def main(args: Array[String]): Unit = {

     for(i <- 1 to 2; j <- 1 to 2) print((100 *  i + j) + " ")
println() //很常见,带有条件判断的 for 循环
for(i <- 1 to 2; j <- 1 to 2 if i != j ) print((100 * i + j) + " ")
println() //函数
//函数有值,函数可以作为函数的参数去传递 def add(x: Int) = x +100
val add2 = (x: Int) => x + 100 println(add(5))
println(add2(10)) //递归函数必须指明函数的返回值
def fac(n: Int): Int = if(n <= 0) 1 else n * fac(n-1)
println(fac(10)) //函数的默认参数
def combine(content : String ,left : String = "[" , right : String = "]" ) = left + right
println(combine("i love jason")) //函数的参数可变
def connected(args: Int*) = {
var result = 0;
for(arg <- args) result += arg
result
} println(connected(1,2,3,4,5)) } }

关于lazy

 package first.scala

 import scala.io.Source

 object lazyOps {
def main(args: Array[String]): Unit = { //lazy 修饰的变量或者常量,只有在第一次被使用的时候,它才被实例化。懒执行,
lazy val file = Source.fromFile("E:\\test.txt")
for(line <- file.getLines()) println(line)
}
}

[原创]Scala学习:for,function,lazy的更多相关文章

  1. [原创]Scala学习:数组的基本操作,数组进阶操作,多维数组

    1.Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合 2 声明数组变量: 要使用的程序的数组 ...

  2. [原创]Scala学习:Tuple,Array,Map ,文件操作

    1.Tuple:元祖.是一个有用的容器对象. 1)特点:  ① 元祖是不可变的,即,当声明完了一个元祖,那么它的长度就不可以在改变:  ② 元祖可以包含不同类型的数据,对象:   ③ 索引是从 '_1 ...

  3. [原创]Scala学习:流程控制,异常处理

    1.流程控制 1)do..while def doWhile(){ var line="" do{ line = readLine() println("readline ...

  4. [原创]Scala学习:编写Scala脚本

    scala支持脚本 1)在/opt/scala-script下创建一个文件hello.scala 编辑内容如下: $ hello ,this is the first scala script 2)运 ...

  5. [原创]Scala学习:函数的定义

    方式一:标准的定义函数 def 函数名(参数1: 参数类型,参数2: 参数类型): 返回值类型 = { 函数体 } 例子 def max(x: Int,y: Int): Int ={ if(x > ...

  6. [原创]Scala学习:关于变量(val,var,类型推断)

    1.常量定义:  val val 类似于java中的final变量.一旦初始化了,val就不能再被赋值 val megs = "hello world" 2.变量的定义: var ...

  7. scala学习笔记:理解lazy值

    scala> var counter = 0 counter: Int = 0 scala> def foo = {counter += 1; counter} foo: Int scal ...

  8. Scala学习之路 (五)Scala的关键字Lazy

    Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载). 惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量. 在Java中,要实现延迟加载(懒加载),需要自己手动 ...

  9. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

随机推荐

  1. js中json字符串转成js对象

    json字符串转成js对象我所知的方法有2种: //json字符串转换成json对象 var str_json = "{name:'liuchuan'}"; //json字符串 / ...

  2. iframe框架里镶嵌页面;<marquee>:滚动效果;<mark>做标记;内联、内嵌、外联;选择器

    标签:①②③④⑤⑥⑦★ 框架: 一.frameset:(框架集) 1.如果使用框架集,当前页面不能有body 2.cols="300,*":左右拆分,左边宽300,右边宽剩余 3. ...

  3. BLE GATT规范中关于UUID与属性的详细解析

    1. 角色 除了GAP定义了角色之外,BLE还定义了另外2种角色:GATT服务器和GATT客户端,它们完全独立于GAP的角色.提供数据的设备称为GATT服务器,访问GATT服务器而获得数据的设备称为G ...

  4. Qt的学习资料比起其它C/C++的GUI组件来说已经算很全的了

    Qt的学习资料比起其它C/C++的GUI组件来说已经算很全的了.Google的话能解决很多问题,如果没搜到资料的话,如果不是问题太过具体或者奇葩,那就是搜索方法的问题.中文教程中,Qt学习之路系列很不 ...

  5. oracle变量的定义和使用【转】

    在程序中定义变量.常量和参数时,则必须要为它们指定PL/SQL数据类型.在编写PL/SQL程序时,可以使用标量(Scalar)类型.复合(Composite)类型.参照(Reference)类型和LO ...

  6. 帝国CMS备忘

    一. 2级导航: 类似下图这种导航: 实现方式如: 1. 定义一个标签模板,记住ID,具体内容如: 页面模板内容: <li><a href=”[!—bclassurl—]”>[ ...

  7. Intervals---poj1201(差分约束系统)

    题目链接:http://poj.org/problem?id=1201 题目说[ai, bi]区间内和点集Z至少有ci个共同元素,那也就是说如果我用Si表示区间[0,i]区间内至少有多少个元素的话,那 ...

  8. js获取网站根目录

    //js获取网站根路径(站点及虚拟目录),获得网站的根目录或虚拟目录的根地址         function getRootPath(){        var strFullPath=window ...

  9. .NET基础加强,找工作之前可以看看这些............

    .NET基础知识加强: 1  变量命名规则:骆驼命名法:第一个字母小写之后的首字母大写,[对于方法名和类名首字母大写]→培养良好的命名规范. 2  构造函数:没有返回值,方法名和类名相同,每个类中都有 ...

  10. C# 值类型和引用类型及参数传递

    值类型和引用类型: C#数据类型分为两大类:值类型和引用类型. 值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型. 引用类型数据主要有:数组,字符串,接口,委托,类. ...