Chapter12
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的更多相关文章
- 【APUE】Chapter12 Thread Control
今天看了APUE的Chapter12 Thread Control的内容,记录一下看书的心得与示例code. 这一章的内容是对Chapter11 Threads(见上一篇日志)的补充,大部分内容都是理 ...
- JLS(Third Edition) Chapter12 Execution
这一章详细说明在一个program执行时,发生的activities. 它根据JVM和组成program的类.接口.实例的生命周期 组织. 一个JVM从加载一个特定的类并调用它的main方法开始启 ...
- Chapter12&Chapter13:程序实例
文本查询程序 要求:程序允许用户在一个给定文件中查询单词.查询结果是单词在文件中出现的次数及所在行的列表.如果一个单词在一行中出现多次,此行只列出一次. 对要求的分析: 1.读入文件,必须记住单词出现 ...
- Chapter12:动态内存
智能指针——shared_ptr 为了更容易地使用动态内存,新的标准提供了智能指针来管理动态对象.智能指针的行为类似常规指针,重要的区别是它负责自动释放指向的对象. 智能指针的使用方式与普通指针类似. ...
- 读书笔记(chapter1-2)
一.linux内核简介 1.1unix的历史 1.unix强大的根本原因:1.unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的:2.在unix中,所有的东西都被当作文件对待:3.un ...
- Chapter12(动态内存)--C++Prime笔记
1.分配再静态或栈内存中的对象由编译器自动创建销毁. 2.C++中动态内存的管理是通过 new:前者为对象非配空间并返回一个指向该对象的指针. delete:接受一个动态对象的指针,摧毁该对象,并释放 ...
- [SharePoint][SharePoint Designer 入门经典]Chapter12 高级工作流
1.使用Visio2010创建工作流标志 2.使用Visio Graphic服务可视化一个运行的工作流 3.使用InfoPath2010修饰工作流表单 4.导出可重用的工作流
- [using_microsoft_infopath_2010]Chapter12 管理监视InfoPath表单服务
本章概要: 1.在SharePoint中心控制台管理InfoPath设置 2.分析监视浏览器表单开考虑潜在性能问题 3.最小化回发数据
- Java题库——Chapter12 异常处理和文本IO
异常处理 1)What is displayed on the console when running the following program? class Test { public stat ...
随机推荐
- WCF中WcfSvcHost.exe如何禁止自动启动
今天同事问在一个WCF server的解决方案里调试时如何禁止Server自动启动. 经过调查发现, VS的工具WcfSvcHost会在调试时自动扫描工程里的WCF server, 然后启动起来. 如 ...
- poj 1658 Eva's Problem(水题)
一.Description Eva的家庭作业里有很多数列填空练习.填空练习的要求是:已知数列的前四项,填出第五项.因为已经知道这些数列只可能是等差或等比数列,她决定写一个程序来完成这些练习. Inpu ...
- POJ2785(upper_bound)
#include"cstdio" #include"algorithm" using namespace std; ; int A[MAXN],B[MAXN], ...
- 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...
- Android Studio配置使用git
一.准备 如果没有安装git,那么先要到到Git官网下载git,然后按照提示一步一步安装即可,这个没有什么难度,不过要记得安装的目录. 二.Android Studio配置git File->S ...
- ES6之箭头函数中的this
在讲箭头函数中的this之前我们先介绍一下普通函数中的this. 普通函数中的this: (1)this指向它的直接调用者 (2)默认的,非严格模式下,没找到直接调用者则指向window ( ...
- 快速实现CentOS7安装python-pip
1.首先检查linux有没有安装python-pip包,终端执行 pip -V [root@ network-scripts]# pip -V -bash: pip: command not foun ...
- HTTP ERROR
HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HTTP 401.4 ...
- [Uva10641]Barisal Stadium(区间dp)
题意:按照顺时针给出操场的周边点,然后给出周围可以建设照明灯的位置,以及在该位置建设照明灯的代价,照明灯照射的范围与操场的边界相切,现在要求一个最小的花费,要求操场的所有边都被照射到. 解题关键:预处 ...
- 树莓派 Learning 002 装机后的必要操作 --- 02 解决中文问题
树莓派 装机后的必要操作 - 解决中文问题 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 每一块树莓派,装机后都应该执行的步骤 刚装机后, ...