• Scala实践14


    1、Scala的future

    • 创建future
    import scala.concurrent._
    import ExecutionContext.Implicits.global
    object FutureTest {
     val f:Future[String]=Future{"Hello World!"}
    }
    
    • 提供异步

         Java中的Future并不是全异步的,当需要Future里的值的时候,只能用get去获取它,亦或者不断访问Future的状态,若完成再去取值,

    但其意义上便不是真正的异步了,它在获取值的时候是一个阻塞的操作,当然也就无法执行其他的操作,直到结果返回。  

    但在Scala中,则无需担心,虽然它也提供了类似Java中获取值的方式,如下:

    FutureJavaScala
    判断任务是否完成 isDone isCompleted
    获取值 get value

    但是在Scala中可以利用Callback(回调)==》onComplete(或者onSuccess/onFailure)来获取它的结果:

    val f: Future[List[String]] = Future {
      session.getRecentPosts
    }
    
    f onComplete {
      case Success(posts) => for (post <- posts) println(post)
      case Failure(t) => println("An error has occured: " + t.getMessage)
    }
    

      

    2、包

    Scala的代码采用了Java平台完整的包机制。可用两种方法把代码放在命名包内。

    • 一种是通过把package子句放在文件顶端的方式把整个文件内容放进包里。把文件的全部内容放进包里。如:
    package  bobsrockets.navigation
    
    class Navigator
    • 另一种是把代码放进包里的方式更像C#的命名空间。可以在package子句之后把要放到包里的定义用花括号括起来,即同一个文件嵌入不同的包
       package  bobsrockets.navigation{
    
    //在bobsrockets.navigation包中
    
      class Navigator
    
     package  test{
    
    //在bobsrockets.navigation.test包中
    
     class NavigatorSuite
    
        }
    
    }
    • 常有惯例把包名和包含文件的目录相同,但是Scala和文件的布局无关。sbt项目的目录(package users)结构大概如下:
    - ExampleProject
      - build.sbt
      - project
      - src
        - main
          - scala
            - users              //Scala目录从这里开始
              User.scala
              UserProfile.scala
              UserPreferences.scala
        - test
    

      

    3、包对象  

    包可以包含类、对象和特质,但不能包含函数或变量的定义。把工具函数或常量添加到包而不是某个Utils对象,这是更加合理的做法。包对象的出现正是为了解决这个局限。每个包都可以有一个包对象。

    • 需要在父包中定义它,且名称与子包一样。
    package com.nick.impatient
    
    package object people {//包对象
      val defaultName = "Nick"
    }
    package people {
       class Person {
        var name = defaultName // 从包对象拿到的常置
      }
    }
    

      

    4、引用

          在Scala中,import语句可以出现在任何地方,并不仅限于文件顶部。import语句的效果一直延伸到包含该语句的块末尾:这是个很有用的特性。并且可引用其他成员(类,特征,函数等)。

    尤其是对于通配(_)引入而言。通过将引入放置在需要这些引入的地方,减少可能的名称冲突。

    import users._  // 引用包users里面的所有
    import users.User  // 引用users包里的类 User
    import users.{User, UserPreferences}  // 引入被选中的User和UserPreferences
    import users.{UserPreferences => UPrefs}  //引入重命名的
    

     

    5、注解

        注解就是标签,标签是用来标记某些代码需要特殊处理的。可以在代码运行时和编译时操作。

    • 类、方法、字段局部变量、参数、表达式、类型参数以及各种类型定义
    @Entity class Student
    
    @Test def play() {}
    
    @BeanProperty var username = _
    
    def doSomething(@NotNull message: String) {}
    
    @BeanProperty @Id var username = _
    

      

    • 构造器,需要在主构造器之前,类名之后,且需要加括号,如果注解有参数,则写在注解括号里面
    class Student @Inject() (var username: String, var password: String)
    • 为表达式添加注解
    (map1.get(key): @unchecked) match {...}
    • 泛型
    class Student[@specialized T]
    • 实际类型
    String @cps[Unit]
    

      

  • 相关阅读:
    用命令行执行ROBOT FRAMEWORK
    RF ---library
    RF--- selenium
    RIDE指定log和report的输出目录
    robotframework运行时后台报错UnicodeDecodeError
    rf-demos (request)
    RobotFramework --RIDE介绍
    基于RFS(robot framework selenium)框架模拟POST/GET请求执行自动化接口测试
    volatile非原子性示例
    wait()方法写在while循环中可以在线程接到通知后再一次判断条件
  • 原文地址:https://www.cnblogs.com/0205gt/p/11010074.html
Copyright © 2020-2023  润新知