1  if表达式

  • Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型。
scala> val a3=10
a3: Int = 10 scala> val a4=
| if(a3>20){
| "a3大于a4"
| }else{
| "a4大于a3"
| }
a4: String = a4大于a3 scala> val a5=
| if(a3>20)"a3大于20"
a5: Any = () scala> println(a5)
()

  

2  while表达式

  • while循环
scala> def gcdLoop(x:Long,y:Long):Long={
| var a=x
| var b=y
| while(a!=0){
| val temp=a
| a=b%a
| b=temp
| }
| b
| }
gcdLoop: (x: Long, y: Long)Long scala> gcdLoop(8,9)
res0: Long = 1 scala> gcdLoop(8,4)
res1: Long = 4
  •   while循环的中断
import scala.util.control.Breaks
object whilexample {
def main(args:Array[String]): Unit ={
var n=1;
val loop=new Breaks
loop.breakable{
while(n<=20){
n+=1;
if(n==19){
loop.break()
}
}
}
println(n)
}
}

  结果如下:

3  for表达式

  • for中to示例:
scala> for(i <- 1 to 3; j <- 1 to 3){
| print(i * j + " ")
| }
1 2 3 2 4 6 3 6 9
  • for中until示例:
scala> for(i <- 1 until 3; j <- 1 until 3) {
| print(i * j + " ")
| }
1 2 2 4
  • for中的条件判断示例
scala> for(i <- 1 to 3 if i != 2) {
| print(i+" ")
| }
1 3
scala>
  • for中的引入变量
scala> for(i <- 1 to 3; j = 4 - i) {
| print(j+" ")
| }
3 2 1
  • 使用yield关键字,将遍历过程处理结果返回一个值。
scala> val for5 = for(i <- 1 to 10) yield i
for5: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> print(for5)
Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> val for5 = for(i <- 1 to 10)
| print(for5)
<console>:13: error: recursive value for5 needs type
print(for5)
^
  •  过滤,通过for中的() 添加过滤器(filter),就是if子句。
object hello{
def main(args:Array[String]){
val filesHere=(new java.io.File(".")).listFiles
for(file<-filesHere if(file.getName.endsWith(".scala")))
println(file)
}} D:\>scala hello.scala
.\a.scala
.\h.scala
.\hello.scala
.\s.scala

4  try表达式

  • 抛出异常
scala> def ha(n:Int){
| val half=if(n%2==0) print(n/2)
| else
| throw new RuntimeException("n num be even")
| }
ha: (n: Int)Unit scala> ha(7)
java.lang.RuntimeException: n num be even
at .ha(<console>:14)
... 28 elided scala> ha(8)
4

  

  • 捕获异常

捕获异常的语法选择catch子句的原因是与模式匹配保持一致。

 object ExceptionSyllabus {
def divider(x: Int, y: Int): Float= {
if(y == 0) throw new Exception("0作为了除数")
else x / y
}
def main(args: Array[String]): Unit = {
try {
println(divider(10, 3))
} catch {
case ex: Exception => println("捕获了异常:" + ex)
} finally {}
}
} D:\>scala ExceptionSyllabus.scala
3.0 //当数字改为(10,0)后
D:\>scala ExceptionSyllabus.scala
捕获了异常:java.lang.Exception: 0作为了除数

  

5  匹配表达式

  • Scala中的match表达式类似于其它语言的switch语句,它可用提供多个备选项做选择。
object frist{
def main(args:Array[String]){
val firstArg=if(args.length>0)args(0) else ""
firstArg match{
case "salt"=>println("papper")
case "chips"=>println("salsa")
case "eggs"=>println("bacon")
case _=>println("huh?")
}
}
} D:\>scala frist.scala
huh? D:\>scala frist.scala salt
papper

  

6  lazy懒值

  • 当val被声明为lazy时,初始化将被推迟,直到我们首次对此取值,适用于初始化开销较大的场景。 通过lazy关键字的使用与否,来观察执行过程
object Lazy {
def init(): String = {
println("init方法执行")
"嘿嘿嘿,我来了~"
}
def main(args: Array[String]): Unit = {
lazy val msg = init()
println("lazy方法没有执行")
println(msg)
}
}

  结果:

object Lazy {
def init(): String = {
println("init方法执行")
"嘿嘿嘿,我来了~"
}
def main(args: Array[String]): Unit = {
val msg = init()
println("lazy方法没有执行")
println(msg)
}
}

 结果: 

7 柯里化

在函数编程中,将接受多个参数的函数转化为接受单个参数的函数。这一过程称为柯里化

scala> def mul(x: Int, y: Int) = x * y
mul: (x: Int, y: Int)Int scala> println(mul(10, 10))
100 scala> def mulCurry(x: Int) = (y: Int) => x * y
mulCurry: (x: Int)Int => Int scala> println(mulCurry(10)(9))
90 scala> def mulCurry2(x: Int)(y:Int) = x * y
mulCurry2: (x: Int)(y: Int)Int scala> println(mulCurry2(10)(8))
80

  

  • 柯里化的应用:在忽略大小写的情况下,计较是否相等。
scala> val a = Array("Hello", "World")
a: Array[String] = Array(Hello, World) scala> val b = Array("hello", "world")
b: Array[String] = Array(hello, world) scala> println(a.corresponds(b)(_.equalsIgnoreCase(_)))
true

  

Scala实践6的更多相关文章

  1. Scala实践14

    1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...

  2. Scala实践13

    1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...

  3. Scala实践12

    1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...

  4. Scala实践11

    1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...

  5. Scala实践10

    1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...

  6. Scala实践9

    1.特征 Traits用于在类之间共享接口和字段.它们类似于Java 8的接口.类和对象可以扩展特征,但是特征不能被实例化,因此没有参数. 定义一个特征 最小特征只是关键字trait和标识符: tra ...

  7. Scala实践8

    1.1继承类 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法. class Person { var name = "zhangsan" ...

  8. Scala实践7

    一.类 1.1简单类和无参方法 类的定义通过class关键字实现 scala> class Dog { | private var leg = 4 | def shout(content: St ...

  9. Scala实践5

    一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...

随机推荐

  1. java中的常量和变量

    变量的概念: 占据着内存中的某一个存储区域; 该区域有自己的名称(变量名)和类型(数据类型); 该区域的数据可以在同一类型范围内不断变化; 为什么要定义变量: 用来不断的存放同一类型的常量,并可以重复 ...

  2. Lua环境搭建之使用EditPlus搭建Lua开发环境

    luatools正则表达式extension工具encoding 一.语法高亮 打开 EditPlus,Tools 工具-->Preferences首选项==>setting & ...

  3. HDU 1236

    水题~~但我做了很久: 题意:是中国人都懂了 思路:结构体排序: 以后要多用用重定义的排序手段,!!!!!多用!!多用!!多用!! #include<iostream> #include& ...

  4. mybatis查询无结果, 数据库运行相同sql查询出结果

    一.问题描述 mybatis查询无结果, 数据库运行相同sql查询出结果, 如下 这是数据库记录 这是mybatis查询出的结果, 记录条数0 这是直接将控制台一模一样的sql查询语句放到Navica ...

  5. JVM调优-Jstack线程分析

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...

  6. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(6)之配置文件设置

    现在该有的结构和层级都有了,下面我们就开始实际应用,首先把需要用的js,css,图片放到Content文件夹中. 这里不详细讲解,大家可根据自己的实际情况,使用合适自己的前端框架,也可以点击下载本项目 ...

  7. 研发环境容器化实施过程(docker + docker-compose + jenkins)

    目录 背景介绍 改造思路 容器构建 基础准备 中间件容器 外部依赖容器 业务应用容器 容器整合 自动构建容器 Maven相关 非Maven项目 总结 背景介绍 目前公司内部系统(代号GMS)研发团队, ...

  8. POJ1741 点分治模板

    传送门:http://poj.org/problem?id=1741 题意: 求树上两点间路径长度小于k的点对个数 题解: 参考资料 守望的淀粉质略解:https://www.luogu.org/bl ...

  9. Hadoop Authentication

    我被被派去做别的事情了,所以与hadoop相关的工作就只能搁下.写篇总结,把最近遇到的和kerberos相关的东西列一下. JAAS是Java 认证和授权服务(Java Authentication ...

  10. C++引用计数设计与分析(解决垃圾回收问题)

    1.引言 上一篇博文讲到https://www.cnblogs.com/zhaoyixiang/p/12116203.html 我们了解到我们在浅拷贝时对带指针的对象进行拷贝会出现内存泄漏,那C++是 ...