1  if表达式

  • Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型。
  1. scala> val a3=10
  2. a3: Int = 10
  3.  
  4. scala> val a4=
  5. | if(a3>20){
  6. | "a3大于a4"
  7. | }else{
  8. | "a4大于a3"
  9. | }
  10. a4: String = a4大于a3
  11.  
  12. scala> val a5=
  13. | if(a3>20)"a3大于20"
  14. a5: Any = ()
  15.  
  16. scala> println(a5)
  17. ()

  

2  while表达式

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

  结果如下:

3  for表达式

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

4  try表达式

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

  

  • 捕获异常

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

  1. object ExceptionSyllabus {
  2. def divider(x: Int, y: Int): Float= {
  3. if(y == 0) throw new Exception("0作为了除数")
  4. else x / y
  5. }
  6. def main(args: Array[String]): Unit = {
  7. try {
  8. println(divider(10, 3))
  9. } catch {
  10. case ex: Exception => println("捕获了异常:" + ex)
  11. } finally {}
  12. }
  13. }
  14.  
  15. D:\>scala ExceptionSyllabus.scala
  16. 3.0
  17.  
  18. //当数字改为(10,0)后
  19. D:\>scala ExceptionSyllabus.scala
  20. 捕获了异常:java.lang.Exception: 0作为了除数

  

5  匹配表达式

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

  

6  lazy懒值

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

  结果:

  1. object Lazy {
  2. def init(): String = {
  3. println("init方法执行")
  4. "嘿嘿嘿,我来了~"
  5. }
  6. def main(args: Array[String]): Unit = {
  7. val msg = init()
  8. println("lazy方法没有执行")
  9. println(msg)
  10. }
  11. }

 结果: 

7 柯里化

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

  1. scala> def mul(x: Int, y: Int) = x * y
  2. mul: (x: Int, y: Int)Int
  3.  
  4. scala> println(mul(10, 10))
  5. 100
  6.  
  7. scala> def mulCurry(x: Int) = (y: Int) => x * y
  8. mulCurry: (x: Int)Int => Int
  9.  
  10. scala> println(mulCurry(10)(9))
  11. 90
  12.  
  13. scala> def mulCurry2(x: Int)(y:Int) = x * y
  14. mulCurry2: (x: Int)(y: Int)Int
  15.  
  16. scala> println(mulCurry2(10)(8))
  17. 80

  

  • 柯里化的应用:在忽略大小写的情况下,计较是否相等。
  1. scala> val a = Array("Hello", "World")
  2. a: Array[String] = Array(Hello, World)
  3.  
  4. scala> val b = Array("hello", "world")
  5. b: Array[String] = Array(hello, world)
  6.  
  7. scala> println(a.corresponds(b)(_.equalsIgnoreCase(_)))
  8. 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. Python--day61--Django ORM单表操作之展示用户列表

    user_list.html views.py 项目的urls.py文件

  2. Spring Data JPA查询指定列,并返回实体(改)

    现有PostEntiy实力,包含各种属性,如: /** * @Auther: DingShuo * @Date: 2018/7/18 11:09 * @Description: */ @Entity ...

  3. Spring Security-利用URL地址进行权限控制

    目的是:系统内存在很多不同的用户,每个用户具有不同的资源访问权限,具体表现就是某个用户对于某个URL是无权限访问的.需要Spring Security忙我们过滤. 参考:http://www.cnbl ...

  4. vue组件之间通过query传递参数

    需求: 从 任务列表进入 任务详情 ,向详情页传递当前 mission_id 值 路由关系: //查看任务列表 { path: '/worklist', name: 'worklist', compo ...

  5. 【t056】智力问答(multiset做法)

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 新年联欢会上,G.Sha负责组织智力问答节目.G.Sha建立了一个很大很大的超级题库,并衡量了每道题的 ...

  6. Linux 内核

    在接口总线领域的最新的一项是外部总线的整个类. 这包括 USB, 固件, 和 IEEE1284(基 于并口的外部总线). 这些接口有些类似于老的非外部的技术, 例如 PCMCIA/CardBus 和 ...

  7. Curator源码阅读 - ConnectionState的管理与监听

    看看Curator框架 为实现对 连接状态ConnectionState的监听,都是怎么构造框架的.后面我们也可以应用到业务的各种监听中. Curator2.13实现 接口 Listener List ...

  8. vue-learning:12-1- HTML5的<template>内容模板元素

    HTML5的<template>内容模板元素 HTML内容模板<template>元素将它其中的内容存储在页面文档中,以供后续使用,该内容的DOM结构在加载页面时会被解析器处理 ...

  9. 【Docker】Jenkins的安装与更新

    一.Jenkins安装 1.获取docker镜像 2.查看jenkins版本 3.启动jenkins容器 docker run -d --name jenkins_01 -p 8081:8080 -v ...

  10. 超简单本地mock假数据测试,模拟后台数据返回必杀技

    温馨提示:急性子可以直接拉到最后观看方法步骤. 什么是mock? mock就是在开发过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试开发的方法. 使用mock有什么好处? ...