Scala ABC

https://docs.scala-lang.org/tour/tour-of-scala.html
http://www.runoob.com/scala/scala-tutorial.html

Array

存储固定大小的同类型元素。 mutable。
Array._ 包提供了很多实用的数组方法:apply, concat, range, etc.

import Array._
scala> var arr = Array(1, 2, 3)
arr: Array[Int] = Array(1, 2, 3)scala> for (i <- arr) {println(i)}
1
2
3scala> for (i <- arr) println(i)
1
2
3scala> var arr2 = Array(4, 5, 6)
arr2: Array[Int] = Array(4, 5, 6)scala> var myList1 = range(10, 20, 2)
myList1: Array[Int] = Array(10, 12, 14, 16, 18)

Collection: List, tuple, Map, Set, Iterator

  • list immutable
// 构建
scala> var li = List(1,2)
li: List[Int] = List(1, 2)scala> var tu = (1, 2, 'hh')   // scala 字符串 ""
<console>:1: error: unclosed character literal
var tu = (1, 2, 'hh')                   ^scala> var tu = (1, 2, "hh")  //元祖元素可不同类型
tu: (Int, Int, String) = (1,2,hh)scala> var li = 1::2::3
<console>:13: error: value :: is not a member of Intvar li = 1::2::3^scala> var li = 1::2::Nil       // Nil 视为空list
li: List[Int] = List(1, 2)scala> var li = 1::2::"hh"::Nil
li: List[Any] = List(1, 2, hh)// 前后连接
scala> 0 +: li
res7: List[Any] = List(0, 1, 2, hh)scala> li :+ 3
res9: List[Any] = List(1, 2, hh, 3)// index 获取元素
scala> li(2)
res5: Any = hhscala> li.apply(2)
res10: Any = hhscala> tu._1
res6: Int = 1// 其他方法
scala> li.contains("hh")
res11: Boolean = truescala> li.exists(s => s == "hh")
res13: Boolean = truescala> val li = List(1,2,3)
li: List[Int] = List(1, 2, 3)scala> li.filter(x => x>1)
res14: List[Int] = List(2, 3)scala> li.map(x => x+1)
res15: List[Int] = List(2, 3, 4)scala> li.reduce((x, y) => x+y)
res16: Int = 6scala> li
res17: List[Int] = List(1, 2, 3)scala> li.foreach(print)
123
scala> li.forall(x => x>0)
res19: Boolean = truescala> li.drop(2)
res20: List[Int] = List(3)scala> li
res21: List[Int] = List(1, 2, 3)scala> li.dropRight(2)
res22: List[Int] = List(1)scala> li.take(2)
res23: List[Int] = List(1, 2)scala> li.takeRight(2)
res24: List[Int] = List(2, 3)scala> li.dropWhile(x => x>1)
res25: List[Int] = List(1, 2, 3)scala> li.mkString
res26: String = 123scala> li.toString()
res27: String = List(1, 2, 3)scala> li.toArray
res28: Array[Int] = Array(1, 2, 3)scala> li
res29: List[Int] = List(1, 2, 3)
// 一个 SEQ 是一个具有已定义元素顺序的Iterable。序列提供了一种方法 apply() 用于索引,范围从0到序列的长度。 Seq有许多子类,包括Queue,Range,List,Stack和LinkedList。
// 参考http://landcareweb.com/images/861/2fjoA.png
scala> li.toSeq
res30: scala.collection.immutable.Seq[Int] = List(1, 2, 3)scala> li.toSet
res31: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

Scala 基础示例

三点: scala 交互式命令示例、OOP编程示例 和 Scala函数示例

Spark-shell scala 交互式命令行

$ scala
// $ $SPARK_HOME/bin/spark-shellscala> print(1+2) // 3scala> val books = List("Hadoop","Hive","HDFS")   // books: List[String] = List(Hadoop, Hive, HDFS)
// Map 映射
scala> book.map(s => (s, 1))    //元组,可含不同数据类型: List[(String, Int)] = List((Hadoop,1), (Hive,1), (HDFS,1))
// flatMap “拍扁式”映射
scala> books.flatMap(s => s.toList)        // List[Char] = List(H, a, o, o, p, H, i, v, e, H, D, F, S)
// filter
scala> books.filter(s => s.contains("doop"))    //List[String] = List(Hadoop)
scala> books.books.filter(_.contains("doop"))
// reduce
scala> books.reduce( (x,y) => {print(x,y); x+y} ) // (Hadoop,Hive) (HadoopHive,HDFS)res4: String = HadoopHiveHDFS
scala> books.reduce(_ + _)
// reduceLeft 同 reduce
scala> books.reduceLeft( (x,y) => {print(x,y); x+y} )  // (Hadoop,Hive)(HadoopHive,HDFS)res5: String = HadoopHiveHDFS
// reduceRight
scala> books.reduceRight( (x,y) => {print(x,y); x+y} )  //(Hive,HDFS)(Hadoop,HiveHDFS)res6: String = HadoopHiveHDFS

Scala OOP示例

  • 方法:
// Method:
def methodName[parameter list][: return type] [= {method body}]// parameter list: param1: type1, param2: type2..., parameter list can be empty.
def emptyMethod = {2}, then emptyMethod: Int, auto-inference.
def m(a: Int):Int = {return 2}, then m: (a: Int)Int, or def m(a: Int) = {2}.// method body 方法体可以为语句statements或表达式expresssion或二者结合,其中表达式只有最后一个生效。
def m(a: Int) = {var b = a*2; b*3; b*4}   // m(1) == 8, 1*2*4// Currying
def adderMethodCurry(x: Int)(y: Int) = {x + y}
adderMethodCurry(1)_ // Int => Int = <function1>
adderMethodCurry(1)(2) // 3
```scala- 类构造器在类声明的参数列表可见
```bash
// 类构造器在类声明的参数列表可见
// val only getter, var getter and setter, Add private both no.
scala> class Person(var name: String)
defined class Personscala> val p = new Person("Hansey")
p: Person = Person@ca31fcscala> p.name
res0: String = Hansey// case class 样例类一般用来描述不可变的对象,多用作模式匹配。构造器会默认参数val ,除非显式更改
scala> case class Person(var name: String)
defined class Personscala> val p = Person("CaseClass-Hansey")
p: Person = Person(CaseClass-Hansey)scala> p.name
res1: String = CaseClass-Hansey
  • 示例
package com.test// Trait, or Interface, similar to abstract class in java
trait Equal {def isEqual(x: Any): Boolean    // abstract methoddef isNotEqual(x: Any): Boolean = !isEqual(x)
}class Point(xc: Int, yc: Int) extends Equal {// constructorvar x = xcvar y = yc// Method:// def methodName[parameter list][: return type] [= {method body}]// parameter list: param1: type1, param2: type2..., parameter list can be empty.// def emptyMethod = {2}, then emptyMethod: Int, auto-inference.// def m(a: Int):Int = {return 2}, then m: (a: Int)Int, or def m(a: Int) = {2}.def move(dx: Int, dy: Int) = {x += dxy += dy}// Implement trait abstract methoddef isEqual(obj: Any): Boolean = {obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == x && obj.asInstanceOf[Point].y == y}// Override Non-abstract method in the Any Classoverride def toString= "point x: %d, y: %d ".format(x, y)
}class Location(xc: Int, yc: Int, zc: Int) extends Point(xc, yc){var z: Int = zc// override, same name and same argsoverride def move(dx: Int, dy: Int): Unit = {x += 2*dxy += 2*dy}def move(dx: Int, dy: Int, dz: Int) =  {super.move(dx, dy)z = z + dz}override def toString= "location x: %d, y: %d , z: %d ".format(x, y, z)
}object pointRun{def main(args: Array[String]): Unit ={println("---------Test OOP point-------------")val pt = new Point(1,1)pt.move(2,2)println("point pt: ", pt)val lo = new Location(1, 1, 1)lo.move(1,1)lo.move(1,1,1)println("location lo: ", lo)val loFinal = new Location(4, 4, 2)println("location Final loFinal: ", loFinal)printf("lo.isEqual(loFinal): %s \n", lo.isEqual(loFinal))}
}

Scala 函数示例

  • 函数
// Function
// val funcName[: (function type)] = (parameter list) => {function body}
// val funcName[: (function type)] = lambda expression
val adder: (Int, Int) => (Int) = (x: Int, y: Int) => {x + y}// function body 函数体只能为表达式(不能有如var a = b等赋值语句,不能显式return等),其中表达式只有最后一个生效。花括号可省略。
val f = (a: Int) => {a*2; a*3} // f(1) == 3, a*3// parameter list can be empty
val noParamFun = () => 2
  • 示例
package com.testobject funcs {// Function// val funcName[: (function type)] = (parameter list) => {function body}, parameter list can be empty.// val funcName[: (function type)] = lambda expressionval adder: (Int, Int) => (Int) = (x: Int, y: Int) => x + y// Auto type inference// val adder: (Int, Int) => (Int) = (x, y) => x + y// val adder = (x: Int, y: Int) => x + y// Currying: Transfer a multi-args function to a chain of function in which every function has only one parameterval adderFuncCurry = (x: Int) => (y: Int) => x + ydef adderMethodCurry(x: Int)(y: Int) = {x + y}def run() ={print("---------Test functions-------------")println("adder(100, 1): ", adder(100, 1))   // 101println("adderFuncCurry(100)(1): ", adderFuncCurry(100)(1))  // 101val addBase100 = adderFuncCurry(100)println("addBase100(1): ", addBase100(1)) // 101println("adderMethodCurry(100)(1): ", adderMethodCurry(100)(1))}
}

<全文完>

Scala语法汇集ABC相关推荐

  1. Scala语法之常量变量和运算符

    Scala语法之常量变量和运算符 1. 背景 官网:https://www.scala-lang.org/ scala是什么 上述截图可知,scala是一门编程语言.静态语言需要编译才能运行,强类型语 ...

  2. Spark记录-Scala语法基础

    参考:http://docs.scala-lang.org/cheatsheets/index.html.http://docs.scala-lang.org/.http://www.scala-la ...

  3. Scala 语法基础

    一 Scala 命令行或者解释器的使用 REPL:Read(取值)--> Evaluation(求值)-->Print(打印)-->Loop(循环) Scala解释器也被称为REPL ...

  4. Scala语法(一) 基础语法(变量常量判断循环数组集合)

    前言 在前面的章节中, 我们介绍了如何在Eclipse内安装Scala环境. 本章开始, 我们将讲解下Scala的基本语法. PS: 1. 个人虽然没有想转Scala语言开发的思想, 但是近来Scal ...

  5. Scala语法从入门到高级运用

    目录 1.scala语言特点 2.函数式编程 3.scala的安装 4.scala语言的简介 5.scala编程语言的规范 6.scala的类型体系(重点!) 7.变量的用法: 8.数值类型 9.类型 ...

  6. Scala语法介绍(十):元组-列表-Set-Map映射

    元组 元组可以用来包含一组不同类型的值.例如:姓名,年龄,性别,出生年月.元组的元素是不可变的. 定义元组 使用括号来定义元组 val/var 元组 = (元素1, 元素2, 元素3....) 使用箭 ...

  7. Scala语法介绍(九):数组

    数组 scala中,有两种数组,一种是定长数组,另一种是变长数组 定长数组 定长数组指的是数组的长度是不允许改变的 数组的元素是可以改变的 语法: // 通过指定长度定义数组 val/var 变量名 ...

  8. 明显调用的表达式前的括号必须具有函数类型_Chisel(二) Scala语法 变量与函数...

    变量: Scala在定义一个变量时,必须在其变量名前添加关键字"var"或"val"这两者的区别是"var"修饰的变量可以新赋值,并把原值抛 ...

  9. 【scala初学】scala 语法 声明

    我一般学习一门语言,大多一天能写个简单小功能. 至今遇到两个语言把我吓到了,一个是汇编,一个就是这个货,scala. 看spark源码是怎么把我逼疯的. 1 2 3 4 5 6 7 8 9 10 11 ...

最新文章

  1. js function如何传入参数未字符串_Python爬虫 JS 案例讲解:爬取漫画
  2. python数据类型转换方法列表
  3. ABAP设置输入焦点和表格控件行数的注意事项
  4. Python super超类方法
  5. ARM 之五 发展史及各时期内核(ARM1 ~ ARM11 / Cortex)介绍
  6. 快速了解 MySQL 的性能优化
  7. java集成lucene_将Lucene搜索集成到应用程序中
  8. Firefox搜索框:自动出现添加搜索的提示
  9. Microsoft Visual Studio Tools for AI
  10. c语言输出随机数switch,在Switch语句案例中使用随机数
  11. 京东羚珑页面可视化平台介绍
  12. Linux unison 效率,Linux下inotify+unison双向同步环境部署
  13. 强连通分量 Kosaraju科萨拉朱算法
  14. python第三方库笔记本_Python用什么笔记本电脑较好?
  15. String Shifting
  16. 安全研究 # 二进制代码相似性检测综述
  17. 智能手环---设计与实现
  18. 竖子不足与谋(转自天下三国)
  19. substr函数功能
  20. C语言malloc初始化问题

热门文章

  1. redis常用命令 (查询出所有的商品,并返回json给客户端)redis之路(八)
  2. Openfire 用户密码加密
  3. 忘记手机密码怎么用计算机解开,手机忘记密码怎么办?教你三种方法帮你搞定!...
  4. 幽默感七个技巧_16个聊天幽默技巧 几招让你变的风趣幽默
  5. C++ 设置桌面壁纸
  6. 【JZOJ100208】【20190705】传说之下
  7. 64位windows无法正常安装dnw的解决方案
  8. 事件A和B之间相互独立与互不相容的理解
  9. MFC CString 长度取得
  10. AcWing寒假每日一题 2058.笨拙的手指