`
tcspecial
  • 浏览: 911463 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Scala 使用

    博客分类:
  • java
阅读更多


一. 安装环境

wget https://downloads.lightbend.com/scala/2.12.6/scala-2.12.6.tgz

vi ~/.bash_profile

export PATH=$SCALA_HOME/bin:$PATH

 

二. 运行

Scala是解释性JVM语言,编译后会生成*.class。也可在交互式CLI上编码。

ling-Pro:~ sun$ scala
Welcome to Scala 2.12.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_102).

scala> var list = List(1,2,3)
list: List[Int] = List(1, 2, 3)

scala> println("hello world")
hello world

 

三. 示例

新的语言总会有一些奇怪的语法或表达式。

//import java.util._			// All
//import java.awt.{Color, Font}  // Part

/**
 * trait相当于Interface,但可有方法体,支持多重继承
 */
trait MyTrait {
	def show()
	def foo(){
		println("Hello foo")
	}
}

/// Impl
class MyTraitImpl extends MyTrait{
	def show(){
		println("Hello show")
	}
}


/// Objec
object Test {
	def init(): String = {
		println("Init var")
		return "kettas"
	}

	/**
	 * 默认访问修饰符为 public
	 * 测试返回多个元素(元组)
	 * ReturnType = {}	比较奇怪
	 */ 
	def getMulit(a: Int) : Tuple2[Int, String] = {
		return (a, "Hello")
	}

	// 测试类型
	def testType(){
		var mystr:String = "hello"	
		var myVar = 10		// 类型推断
		val myVar1 = "world"

		// lambda
		val f = (x: Int) => x+3
		Console.println(f(5))
	}

	// 测试for循环
	def testLoop(){
		var list = List(1,2,3,4,5,6)

		// foreach <-操作符
		for (a <- list)
		{
			Console.print(a + "\t")
		}

		// range
		for (a <- 1 to 10)
		{
			Console.print(a + "\t")
		}

		Console.println()
	}

	/**
	 * 测试容器
	 * Uint =  相当于 void, 可省略
	 */
	def testContainer(): Unit = {
		val map: Map[Int, String] = Map(1 -> "hello", 2 -> "world")
		val v1: Option[String] = map.get(1)		// 可选值结构
		val v2: Option[String] = map.get(3)

		// Option vs Some
		println(v1)
		println("v1: " + v1.get)	// Some(hello) Some是一个类,通过some.get获取值
		println("v2: " + v2)	// None

		// 获取元组
		val tuple = getMulit(5)
		println(tuple._1)
		println(tuple._2)

		// ++操作符,用于连接两集合
		val l1 = List(1, 2)
		var l2 = List(3, 4)
		var l5 = l1 ++ l2	// (1,2,3,4)

		// 可变容器,链表实现
		val buf = collection.mutable.ListBuffer.empty[Int]
		buf += 1
		buf += 10 
		println(buf.toList)	// 1,10
	}

	/**
	 * lazy关键字使用
	 * 借鉴懒汉式单例模式实现思想,使用变量时才初始化
	 *
	 */
	def testLazy(){
		lazy val a = init();
		println("After init")
		println(a)		// After init; Init var; kettas
	}

	// main
	def main(args: Array[String]){
		// 基本类型测试
		testType()

		// 循环测试
		testLoop()

		// 容器测试
		testContainer()

		// 懒加载
		testLazy()

		// 测试类
		val p = new MyTraitImpl()
		p.show()
	}
}

 

 四. 其它语法

4.1 App

App 类连main方法都封装了,不过采用延迟加载方式。

object HelloScala extends App { 
	println("Hello scala!") 
}

 运行输出:Hello scala!

 

4.2 case语法

 1. case match

与java switch语法类似,新增=>操作分隔模式和表达式。

def matchTest(x: Int): String = x match {
  case 1 => "one"
  case 2 => "two"
  case _ => "many"
}

println( matchTest(1) )		// one

 

2. case class

// case类默认不可变,可通过模式匹配分解
case class Person(name: String, age: Int)

val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)

// 遍历用户列表
for (person <- List(alice, bob, charlie)) {
	person match {
		case Person("Alice", 25) => println("Hi Alice!")
		case Person("Bob", 32) => println("Hi Bob!")
		case Person(name, age) =>
		   println("Age: " + age + " year, name: " + name + "?")
	}
}

输出: 

Hi Alice!

Hi Bob!

Age: 32 year, name: Charlie?

 

五. Akka框架

Akka 是一组构建高并发,分布式,弹性消息驱动应用工具库,便于构建JVM的并发应用和分布式应用,支持java/scala。

 

基础示例:

import akka.actor._
import akka.util._
 
/** Simple hello from an actor in Scala. */
object Hello1 extends App {
  // 配置 
  val system = ActorSystem("actor-demo-scala")
  val hello = system.actorOf(Props[Hello])

  hello ! "Bob"		// ! 运算符是 Akka 中表示将一条消息发送到 actor 的便捷方式
  Thread sleep 1000
  system shutdown
  
  // 接收器 
  class Hello extends Actor {
    def receive = {
      case name: String => println(s"Hello $name")   // s 字符串插值器
    }
  }
}

 

 

 

 

参考:

https://akka.io

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Scala考试题1

    - Scala 使用 REPL(Read-Eval-Print Loop),Java 需要编译。 - Scala 有更强大的模式匹配,Java 需要使用 switch-case 或者 if-else。 15. **Java 集合与 Scala 集合的转换**: - 导入 `scala.jdk....

    scala 教程

    - 使用Scala解释器。 - 定义变量。 - 定义函数。 - 编写Scala脚本。 - 使用`while`循环和`if`判断。 - 使用`foreach`和`for`枚举。 **第3章:Scala的下一步** - **进阶技巧**: - 带类型的参数化数组。 - ...

    scala教材.docx

    14. **异常处理**:Scala 使用 `try-catch-finally` 语句处理异常,与 Java 类似,但语法更为简洁。 选择 Scala 的原因包括其表达能力、函数是一等公民(first-class citizen)、闭包支持、简洁性、类型推断、函数...

    programming in scala

    Scala使用`object`关键字来声明单例对象,这是一种特殊的类,只有一个实例。例如,上述示例中的`HelloWorld`就是一个单例对象。 - **主方法(main method)**:类似于Java,Scala程序的入口点也是一个`main`方法,...

    Scala编程语言详解(从入门到精通)spark

    - **使用 Scala REPL**:Scala REPL(Read-Eval-Print Loop)是一个交互式的 Scala 解释器,可以直接执行 Scala 代码并立即查看结果。 - **使用 ScalaDoc**:Scala 提供了类似于 JavaDoc 的工具 ScalaDoc,可以用来...

    Swift和Scala语法的比较

    在for循环中,Swift使用for-in来遍历集合或进行范围迭代,例如`for i in 1...5 { print("i=\(i)") }`,而Scala使用`for (i ) yield i^2`来实现类似功能。Scala还提供了for-yield结构来生成序列,Swift在这方面没有...

    头歌Scala中集合的使用

    Scala中集合的使用 大学生 1. List 列表的使用 2. Set 集合的使用 3.Map 映射的使用 4. 元组的使用

    scala + mybatis 数据库查询

    通过使用Scala的Java互操作性,我们可以无缝地在Scala中使用MyBatis。 - 集成步骤通常包括添加MyBatis和其Scala绑定库到项目依赖,配置MyBatis的SqlSessionFactory,并编写Scala版的Mapper接口。 2. **Scala版的...

    mongo-scala-drive的使用demo

    在 Scala 中与 MongoDB 进行交互,通常我们会使用 `mongo-scala-driver`,而不是 `mongo-java-driver`,因为 Scala 驱动提供了更符合 Scala 语言特性的 API 设计。本示例将详细介绍如何使用 `mongo-scala-driver` ...

    scala3 scala3 scala3 scala3 scala3

    在Scala3中,你可以使用单表达式函数,而无需使用`=&gt;`。例如,`x =&gt; x + 1` 可以直接写为 `(x) + 1`。此外,`def` 和 `val` 的定义现在可以合并,使得函数定义更加紧凑。 模式匹配的增强也是Scala3的重要特性。新的...

    apollo-scala-1.2-scaladoc.jar

    标签:apollo-scala-1.2-scaladoc.jar,apollo,scala,1.2,scaladoc,jar包下载,依赖包

    Scala 使用IDEA开发

    使用IntelliJ IDEA(简称IDEA)作为开发环境可以提供高效、便捷的Scala开发体验。以下是如何在IDEA中配置和使用Scala进行开发的详细步骤: **安装Scala插件** 1. 打开IDEA,进入设置界面(Preferences on macOS,...

    Scala语言规范PDF版

    Scala使用类模板来定义类,类模板可以包含成员定义、构造器、继承闭包等。类定义中还可以使用各种修饰符,包括访问修饰符和抽象修饰符等。Scala中的对象可以是单例的或者可以创建多个实例。 模式匹配是Scala中一项...

    scala sdk scala-2.12.3

    通过学习和使用Scala SDK,开发者可以利用其丰富的语言特性来构建复杂的软件系统,尤其是在大数据处理、Web应用、云计算等领域,Scala已经展现出了强大的生命力。例如Apache Spark,一个流行的分布式计算框架,就是...

    Scala by Example

    11. Hindley/Milner类型推断:Scala使用了一种强大的类型推断系统,类似于Hindley/Milner类型系统,这有助于减少冗余的类型注解,同时保持代码的类型安全性。 12. 并发抽象:最后,本书将介绍Scala在并发编程领域...

    jackson-module-scala, 关于Jackson的模块( http,添加.zip

    jackson-module-scala, 关于Jackson的模块( http,添加 重要请至少使用 2.6.5个版本或者 2.7.2 ;早期发布版本已知包含重要的Bug 。概述Jackson是一个支持三个模型的快速JSON处理器: 流,node 和对象映射( XML SAX ...

    Scala语法简明教程

    - Udemy上的《Scala and Akka Microservices》:教授如何使用Scala和Akka框架构建微服务。 - **社区与论坛**: - Scala官方网站([http://www.scala-lang.org](http://www.scala-lang.org/)):提供了大量的文档...

    dreampie-play-scala.zip

    dreampie_scala 使用play框架Sbt依赖管理,集成Oauth验证,repatcha验证码,权限系统,数据库自动升级脚本,socketio通信等 bootstrap前端 可直接使用sbt run直接跑,数据库可以自动验证生成初始化数据 ...

    libgdx-scala-template:用于从Scala使用libgdx的模板项目

    《使用Scala和libgdx构建游戏模板项目》 在当今的数字娱乐产业中,游戏开发已经成为一项技术密集型的工作,而LibGDX作为一款强大的跨平台游戏开发框架,深受开发者们的喜爱。配合强大的编程语言Scala,我们可以创建...

    Scala编程-前15章-p185.7z

    3. **包和导入**:Scala使用包来组织代码,导入语句用于引入其他包中的类和对象以便使用。 4. **函数式编程**:Scala支持高阶函数,即可以作为参数传递或作为返回值的函数。函数可以作为一等公民,这使得函数式编程...

Global site tag (gtag.js) - Google Analytics