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. XP系统下显示文件或文件的安全选项卡

    在很多的时候,我们需要设置文件或文件夹的权限,这里一般就要用到安全选项卡,但在xp系统下,默认是不显示的,如何调出我们的“安全”选项卡呢? 具体做法:点击“工具”菜单下的"文件夹选项(o). ...

  2. bzoj 1670 Building the Moat护城河的挖掘 —— 凸包

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1670 单调栈维护凸包即可,用叉积判断: 维护上凸壳,然后把所有点的纵坐标翻转再求上凸壳即可, ...

  3. bzoj 2178 圆的面积并 —— 辛普森积分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 先看到这篇博客:https://www.cnblogs.com/heisenberg- ...

  4. 微服务理论之六:ESB与SOA的关系

    一.SOA和ESB一直是没有明确概念的两个缩略词 SOA----面向服务架构,实际上强调的是软件的一种架构,一种支撑软件运行的相对稳定的结构,表面含义如此,其实SOA是一种通过服务整合来解决系统集成的 ...

  5. linux下go的动态链接库的使用

    转自:http://blog.csdn.net/xtxy/article/details/21328143 在使用lua进行服务器端游戏逻辑开发时,发现了LUA的各种不方便的地方,不能编译检查,不能断 ...

  6. net start sql server (instance)

    如何启动 SQL Server 实例(net 命令) 其他版本   可以使用 Microsoft Windows net 命令启动 Microsoft SQL Server 服务. 启动 SQL Se ...

  7. 利用java mail发送邮件

    import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import java ...

  8. JDBC编程之程序优化

    -----------------siwuxie095 首先下载 MySQL 的 JDBC 驱动,下载链接: https://dev.mysql.com/downloads/connector/j/ ...

  9. 很随意的让你了解 - 最小生成树之Prim算法

    首先分成两个容器. 第一个容器就是装有生成树里面的顶点,第二个容器就是装有没有放入这个第一个容器中的顶点. 首先默认往第一个容器里面装一个顶点.然后..计算出第二个容器里所有顶点和这个顶点的距离.没有 ...

  10. 记录一次坎坷的linux内网渗透过程瞎折腾的坑

    版权声明:本文为博主的原创文章,未经博主同意不得转载. 写在前面 每个人都有自己的思路和技巧,以前遇到一些linux的环境.这次找来一个站点来进行内网,写下自己的想法 目标环境 1.linux  2. ...