Scala高阶编程指南
2015-07-25 22:17
274 查看
Scala高阶函数
Scala高阶函数高阶函数
SAM转换
Curring
模式匹配
基本Type
ArrayListTuple
Case Class
提取器
Option
高阶函数
(1 to 9).map("*" * _).foreach(println _) println((1 to 9).reduceLeft(_ * _)) "Spark is the most exciting thing happening in big data today".split(" ") .sortWith(_.length < _.length).foreach(println) //传入参数Double => Double函数的高阶函数 def high_order_functions(f: Double => Double) = f(0.25) println(high_order_functions(ceil _)) println(high_order_functions(sqrt _)) //简化传入函数过程 high_order_functions((x: Double) => 3 * x) high_order_functions((x) => 3 * x) high_order_functions(x => 3 * x) high_order_functions(3 * _) val fun2 = 2 * (_: Double) val fun3: (Double) => Double = 3 * _
SAM转换
var data = 0 val frame = new JFrame("SAM Testing"); val jButton = new JButton("Counter") jButton.addActionListener((event: ActionEvent) => {data += 1; println(data)}) //通过隐式转换 implicit def function(action: (ActionEvent) => Unit) = new ActionListener { override def actionPerformed(event: ActionEvent) { action(event) } } frame.setContentPane(jButton); frame.pack(); frame.setVisible(true);
Curring
//柯里话 def multiple(x: Int, y: Int) = x * y def multipleOne(x: Int) = (y: Int) => x * y println(multipleOne(6)(7)) //数组内容比较 val a = Array("Hello", "Spark") val b = Array("hello", "spark") println(a.corresponds(b)(_.equalsIgnoreCase(_)))
模式匹配
基本Type
//匹配作用域要从小到大 val data =2 data match { case 1 => println("First") case 2 => println("Second") case _ => println("Not Known Number") } //result = data => case "Something" val result = data match { case i if i == 1 => "The First" case number if number ==2 => "The Second" + number case _ => "Not Known Number" } "Hello World!".foreach { c => print( c match{ case ' ' => "space" case ch => "Char: " +ch } )}
Array、List、Tuple
//Array模式匹配 def match_array(arr : Any) = arr match { case Array(0) => println("Array:" + "0") case Array(x, y) => println("Array:" + x + " " +y) case Array(0, _*) => println("Array:" + "0 ...") case _ => println("something else") } match_array(Array(0)) //Array:0 match_array(Array(0,1)) //Array:0 1 match_array(Array(0,1,2,3,4,5)) //Array:0 ... //List模式匹配 def match_list(lst : Any) = lst match { case 0 :: Nil => println("List:" + "0") case x :: y :: Nil => println("List:" + x + " " + y) case 0 :: tail => println("List:" + "0 ...") case _ => println("something else") } match_list(List(0)) //List:0 match_list(List(3,4)) //List:3 4 match_list(List(0,1,2,3,4,5)) //List:0 ... //Tuple模式匹配 def match_tuple(tuple : Any) = tuple match { c2f5 case (0, _) => println("Tuple:" + "0") case (x, 0) => println("Tuple:" + x ) case _ => println("something else") } match_tuple((0,"Scala")) //Tuple: 0 match_tuple((2,0)) //Tuple: 2 match_tuple((0,1,2,3,4,5)) //Something else
Case Class
//定义person以及case class abstract class Person case class Student(age: Int) extends Person case class Worker(age: Int, salary: Double) extends Person case object Shared extends Person //class匹配 def caseOps(person: Person) = person match { case Student(age) => println("I am " + age + "years old") case Worker(_, salary) => println("Wow, I got " + salary) case Shared => println("No property") } caseOps(Student(19)) caseOps(Shared) val worker = Worker(29, 10000.1) val worker2 = worker.copy(salary = 19.95) println(woker2.salary) val worker3 = worker.copy(age = 30) println(worker3.age) //嵌套的case class abstract class Item case class Book(description: String, price: Double) extends Item case class Bundle(description: String, price: Double, items: Item*) extends Item def caseclass_nested(person: Item) = person match { //@引用后面对象 case Bundle(_, _, art @ Book(_, _), rest @ _*) => println(art.description + " : " + art.price) case Bundle(_, _, Book(descr, _), _*) => println("The first description is :" + descr) case _ => println("Oops!") } caseclass_nested(Bundle("1111 Special's", 30.0, Book("Scala for the Spark Developer", 69.95), Bundle("Hadoop", 40.0, Book("Hive", 79.95), Book("HBase", 32.95) ) )) caseclass_nested(Bundle("1212 Special's", 35.0, Book("Spark for the Impatient", 39.95) ))
提取器
val str = "20150628 scala" val pattern = "([0-9]+)([a-z]+)".r str match { case pattern (num, item) => println(num + " " + item) }
Option
val socores = Map("Java" -> 10,"Scala" -> 20) socores.get("Java") match { case Some(name) => println(name) case None => println("No socore") }
相关文章推荐
- Windows7下安装Scala 2.9.2教程
- XML 文件解析--含Unicode字符的XML文件
- 分分钟掌握快速排序(Java / Scala 实现)
- Scala极速入门
- Spark初探
- Scala实现REST操作
- Scala method call syntax
- 关于Scala多重继承的菱形问题
- Scala 高阶函数(high-order function)剖析
- Spray.io搭建Rest服务
- Spray.io搭建Rest — 支持Twirl模板并部署
- 搭建hadoop/spark集群环境
- ScalaMP ---- 模仿 OpenMp 的一个简单并行计算框架
- 用Scala实现延迟计算
- SBT学习 [持续更新...]
- Scala创建新的控制结构
- Scala: 一次命令式到函数式的重构
- 浅谈Scala的特质(trait)
- 浅谈Scala 2.8的包对象(package object)