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. uoj problem 14 DZY Loves Graph

    题目: DZY开始有 \(n\) 个点,现在他对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 \(1\) 开始编号)有可能的三种情况: Add a b: 表示在 \( ...

  2. bzoj 3727: Final Zadanie 思维题

    题目: Description 吉丽YY了一道神题,题面是这样的: "一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行会议,所有人都从原住址沿着最短路径来到i结 ...

  3. bzoj 3689: 异或之 Trie+堆

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3689 题解: 利用一个优先队列存储当前取到的数 然后再写一颗支持查找异或的k大值的Tri ...

  4. gulp之压缩css

    /** * css压缩 * npm install --save-dev gulp-minify-css * npm install --save-dev gulp-rename * * * 可参考: ...

  5. Ubuntu中Could not get lock /var/lib/dpkg/lock

    找出所有的 apt 以及 apt-get 进程: ps -A | grep apt-get 杀死进程: processnumbe 删除锁定文件: rm /var/lib/dpkg/loc 之后像下面这 ...

  6. POJ百练—IP地址转换

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; ]; void ...

  7. C语言计算日期间隔天数的经典算法解析

    #include <stdio.h> #include <stdlib.h> int day_diff(int year_start, int month_start, int ...

  8. <正则吃饺子> :关于使用pd创建表时需要注意的地方

    公司项目使用pd设计数据库表.之前用过,但是年代比较久远了,有些细节忘记了,今天重新使用时候,生疏了,现在稍微记录下吧. 1.pd创建表的使用,可以直接从网上搜索,博文比较多,如 “pd 设计数据库表 ...

  9. (转)JAVA中的权限修饰符

    注:本博文是转载的,原文地址:http://blog.csdn.net/xk632172748/article/details/51755438 Java中修饰符总结: 访问控制修饰符 访问控制修饰符 ...

  10. TCP的三次握手和四次挥手,为什么?

    首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息.而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双 ...