package scala
import java.awt.event.{ActionEvent, ActionListener}
import javax.swing.JButton import scala.math._ /**
* Created by EX-CHENZECHAO001 on 2018-04-04.
*/
class Chapter12 { } object Chapter12 {
// 12.3 带函数参数的函数
// 这里的参数可以是任何接受Double并返回Double的函数。ValueAtOneQuarter函数将计算那个函数在0.25的位置的值
def valueAtonQuarter(f: (Double) => Double) = f(0.25)
valueAtonQuarter(ceil _) // 1.0
valueAtonQuarter(sqrt _) // 0.5(0.5 * 0.5 = 0.25)
// valueAtonQuarter是一个带有单个参数的函数,它的类型写做 (参数类型) => (结果类型)
// valueAtonQuarter类型为((Double) => Double) => Double
// 接受函数参数的函数,称做高阶函数(higher-order funcation)
// 高阶函数可以产出另外一个函数
def mulBy(factor: Double) = (x: Double) => factor * x
val result1203 = mulBy(3)
result1203(20) // 60
// mulBy函数有一个类型为Double的参数,返回一个类型为(Double) => Double的函数,因此,它的类型为 (Double) => ((Double) => Double) // 12.4 参数(类型)推断
valueAtonQuarter((x:Double) => 3 * x)
// 由于valueAtonQuarter方法知道你会传入一个类型为(Double)=Double的函数,可简写为
valueAtonQuarter((x) => 3 * x)
// 对于只有一个参数的函数,可省略参数外围的()
valueAtonQuarter(x => 3 * x)
// 如果参数在=>只出现一次,可用_替换
valueAtonQuarter(3 * _)
// 这些简写仅在参数类型已知的情况下有效 // 12.5 一些有用的高阶函数
// 0.1 - 0.9集合
(1 to 9).map(0.1 * _)
// 打印三角形
(1 to 9).map("*" * _).foreach(println _)
// 得到一个序列中的所有偶数
(1 to 9).filter(_ % 2 == 0)
// reduceLeft方法接受一个二元的函数,即一个带有两个参数的函数,并将它应用到序列中的所有元素,从左到右
(1 to 9).reduceLeft(_ * _) // 等同 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9
// 按单词长度排序
"Mary has a little lamb".split(" ").sortWith(_.length <= _.length) // 12.6 闭包
val triple = mulBy(3)
val half = mulBy(0.5)
println(triple(14) + " " + half(14)) // 将打印 42 7
// 闭包由代码和代码乃至的任何非局部变量定义构成 // 12.7 SAM转换
// 按钮被点击时递增一个计数器
var counter = 0
val button = new JButton("Increment")
button.addActionListener(new ActionListener {
override def actionPerformed(e: ActionEvent): Unit = {
counter += 1
}
}) /* button.addActionListener((event: ActionEvent) => countter += 1) implicit def makAction(action: (ActionEvent) => Unit) = {
new ActionListener {
override def actionPerformed(e: ActionEvent): Unit = {
action(event)
}
}
}
//////////////// 未理解
*/ // 12.8 柯里化
// 柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数
def mul(x: Int, y: Int) = {
x * y
} // 以下函数接受一个参数,生成另一个接受单个参数的函数
def mulOneAtATime(x: Int) = (y: Int) => x * y // 计算两个数的乘积,调用命令
mulOneAtATime(6)(7)
// mulOneAtATime(6)的结果是函数(y: Int) => 6 * y,这个函数又这被应用到7,因此最终得到42
// Scala支持如下简写来定义这样的柯里化函数
def mulOneAtATime1208(x: Int)(y: Int) = x * y
// 作用: 通过柯里化把某个函数参数单拎出来,以提供更多用于类型推断的信息 // 比较两个序列是否在某个对比条件下相同
val a = Array("Hello", "scala")
val b = Array("Hello", "java")
a.corresponds(b)(_.equalsIgnoreCase(_)) // 12.9 控制抽象
// 在Scala中,我们可以将一系列的语句组成不带参数也没有返回值的函数
// 类型() => Unit
def runInThread(block: () => Unit): Unit ={
new Thread {
override def run(): Unit = {
block()
}
}.start()
}
runInThread{
() => println("Hi")
Thread.sleep(1000)
println("Bye")
}
// 在调用中省掉 () => ,可以使用换名调用表示法:在参数声明和调用该函数参数的地方略去(),但保留=>
def runInThread(block: => Unit): Unit ={
new Thread{
override def run(): Unit = {
block
}
}.start()
}
// 调用代码
runInThread{
println("Hi")
Thread.sleep(1000)
println("Bye")
} // 测试
(1 to 9).map(x => {
runInThread{
println(x)
Thread.sleep(x * 1000)
println("Bye " + x)
}
}) //
def until1209(condition: => Boolean)(block: => Unit): Unit ={
if(!condition){
block
until1209(condition)(block)
}
}
// 调用
var x = 10
until1209(x == 0){
x -= 1
println(x)
}
//////////////// 需重新重点理解 // 12.10 return表达式
// 在Scala中,不需要用return语句来返回函数值。函数的返回值就是函数体的值
// 可以用return来从一个匿名函数中返回值给包含这个匿名函数的带名函数。
def indexOf(str: String, ch: Char): Int = {
var i = 0
until1209(i == str.length) {
if(str(i) == ch) return i
i += 1
}
return -1
} }

Chapter12的更多相关文章

  1. 【APUE】Chapter12 Thread Control

    今天看了APUE的Chapter12 Thread Control的内容,记录一下看书的心得与示例code. 这一章的内容是对Chapter11 Threads(见上一篇日志)的补充,大部分内容都是理 ...

  2. JLS(Third Edition) Chapter12 Execution

    这一章详细说明在一个program执行时,发生的activities. 它根据JVM和组成program的类.接口.实例的生命周期 组织.   一个JVM从加载一个特定的类并调用它的main方法开始启 ...

  3. Chapter12&Chapter13:程序实例

    文本查询程序 要求:程序允许用户在一个给定文件中查询单词.查询结果是单词在文件中出现的次数及所在行的列表.如果一个单词在一行中出现多次,此行只列出一次. 对要求的分析: 1.读入文件,必须记住单词出现 ...

  4. Chapter12:动态内存

    智能指针——shared_ptr 为了更容易地使用动态内存,新的标准提供了智能指针来管理动态对象.智能指针的行为类似常规指针,重要的区别是它负责自动释放指向的对象. 智能指针的使用方式与普通指针类似. ...

  5. 读书笔记(chapter1-2)

    一.linux内核简介 1.1unix的历史 1.unix强大的根本原因:1.unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的:2.在unix中,所有的东西都被当作文件对待:3.un ...

  6. Chapter12(动态内存)--C++Prime笔记

    1.分配再静态或栈内存中的对象由编译器自动创建销毁. 2.C++中动态内存的管理是通过 new:前者为对象非配空间并返回一个指向该对象的指针. delete:接受一个动态对象的指针,摧毁该对象,并释放 ...

  7. [SharePoint][SharePoint Designer 入门经典]Chapter12 高级工作流

    1.使用Visio2010创建工作流标志 2.使用Visio Graphic服务可视化一个运行的工作流 3.使用InfoPath2010修饰工作流表单 4.导出可重用的工作流

  8. [using_microsoft_infopath_2010]Chapter12 管理监视InfoPath表单服务

    本章概要: 1.在SharePoint中心控制台管理InfoPath设置 2.分析监视浏览器表单开考虑潜在性能问题 3.最小化回发数据

  9. Java题库——Chapter12 异常处理和文本IO

    异常处理 1)What is displayed on the console when running the following program? class Test { public stat ...

随机推荐

  1. HTML a标签如何设置margin属性(转)

    很多同学发现对DIV有效的许多CSS属性对<a>或<p>标签都无效,好比说 <div style="margin-top:5px;"></ ...

  2. 立方体贴图(Cubemap)

    http://blog.csdn.net/asdjy123/article/details/51190643 点击打开链接 好东西保存方便查看 立方体贴图(Cubemap) 原文 Cubemaps 作 ...

  3. github 在线 创建文件夹

    参考: http://webapps.stackexchange.com/questions/36411/create-a-folder-in-github-via-the-web-interface

  4. IPC的使用

    IPC,Inter-Processor Communication是SYS/BIOS处理核间通信的组件: IPC的几种应用方式: 1.最小使用(Minimal use) 这种情况是通过核间的通知机制( ...

  5. HDOJ1548(DFS超内存,BFS过了)

    DFS代码 #include<iostream> #include<cstdio> using namespace std; #define Min(a,b) (a<b) ...

  6. SQL常用语法及规则-表格的操作

    一.规则和标准 1)每一行SQL语句结尾,加分号: 2)所创建的对象,名字用反引号(不是引号,与~同一个键): 3)一般关键字或保留字要大写: 4)两个中划线 + 空格(-- ),后面的语句为注释语句 ...

  7. Python:struct模块的pack、unpack

    mport struct pack.unpack.pack_into.unpack_from 1 # ref: http://blog.csdn<a href="http://lib. ...

  8. JavaScript-Tool:jquery.cookie.js

    ylbtech-JavaScript-Tool:jquery.cookie.js 1.返回顶部 1.jquery.cookie.js /*! * jQuery Cookie Plugin v1.4.0 ...

  9. linux日常管理-防火墙selinux

    关闭防火墙 SELINUX=disabled 可以是三种状态 # enforcing - SELinux security policy is enforced.打开# permissive - SE ...

  10. hadoop-2.3.0-cdh5.1.0完全分布式集群配置及HA配置(待)

    一.安装前准备: 操作系统:CentOS 6.5 64位操作系统 环境:jdk1.7.0_45以上,本次采用jdk-7u55-linux-x64.tar.gz master01 10.10.2.57  ...