import java.io.{BufferedReader, File, FileInputStream, InputStreamReader}
import java.util
import java.util.Scanner /**
* Created by thinkpad on 2016/5/9.
*/
object TestHigherKinded { } //借贷模式:函数作为参数传递
object funAsParam{
def opFile(f:File,fun:BufferedReader=>Unit)= {
val reader = new BufferedReader(new InputStreamReader(new FileInputStream(f)))
try{
fun(reader)
}finally {
reader.close()
}
}
opFile(new File("d://123.txt"),(reader:BufferedReader) =>println(reader.readLine()))
} /** scala的函数偏向于理解为数学代数式。因此,函数的参数列表分为值传递和参数名传递
* 1)值传递:如果参数以计算式出现(2+3),则计算值后传入函数
* 2)参数名传递:如果参数以计算式出现,直接带入函数中。
*
* 参数名传递的写法:定义函数的参数形式:参数:=>参数类型
*/
object obj2 {
/**例子1*/
def add1(a: Int, b: Int): Int = a + b
def add2(a: Int, b: => Int): Int = a + b println(add1(1, 2 + 3)) //值传递:先计算2+3=5,在计算add1(1,5)
println(add2(1, 2 + 3)) //参数名传递:add2(1,2+3) = 1+2+3 /**例子2*/
val logEnable = false
def log1(msg:String)={if(logEnable) println(msg)} // 值传递
def log2(msg: =>String)={if(logEnable) println(msg)} // 参数名传递 //log1("hello"+1/0) 1/0报错,函数的值传递先解析参数值
log2("hello"+1/0) // 参数名传递不解析参数值,原样带入函数后,logEnable为false,不用计算1/0
} /** 鸭子类型:
* 如果一只动物,走起来像鸭子或者叫起来像鸭子,就可以把它当作鸭子。
* 也就是说,如果它含有我想要的功能,那么我可以把它当作真的来对待。
* 鸭子类型的写法:
* def 需要的函数名:返回值类型
* {def close():Unit}生命了鸭子类型的行为(带有close方法的对象)
* closeable:{def close():Unit} : 函数别名:鸭子类型
* op:{def close():Unit} => Unit : 函数别名:鸭子类型=> 返回值类型
*/
class obj3{
def withClose(closeable:{def close():Unit},op:{def close():Unit} => Unit)={
try{
op(closeable)
}finally {
closeable.close()
}
} class Connection{
def close():Unit = println("conn is closed")
} val conn = new Connection
withClose(conn,conn=>println("something is done")) // “=>”在scala中用于匿名函数。匿名函数作为参数时,=>左侧是参数列表,右侧是返回值。调用带匿名函数为参数的函数时,=>左侧为参数,右侧为函数体
/*
something is done
conn is closed
*/
} /** 柯里化
* (1) scala认为,参数列表为1的函数时最舒服的函数(类比一元函数),因此,柯里化来实现把多参函数转变为1参函数
* (2) 柯里化的一般过程:
* add(x:Int,y:Int)=x+y ====> add(x:Int)(y:Int)=x+y ====> add(x:Int)=(y:Int)=>x+y
* 括号分开形成2个参数列表参数 参数列表间加=,函数体前面的=变为=>
* */
object obj4 extends App{
// 把上面的鸭子函数柯里化
def withClose(closeable:{def close():Unit})(op:{def close():Unit} =>Unit)={
try{op(closeable)}finally {closeable.close()}
}
class Connection{
def close():Unit = println("conn is closed")
}
val conn = new Connection
withClose(conn)(conn=>println("something is done")) // “=>”在scala中用于匿名函数。匿名函数作为参数时,=>左侧是参数列表,右侧是返回值。调用带匿名函数为参数的函数时,=>左侧为参数,右侧为函数体 } //泛型+鸭子类型+柯里化定义函数 , 简化上面的写法
object obj5 extends App{
def withClose[A <: {def close():Unit},B](closeable:A)(f:A=>B) : B={ //简化的定义
try{f(closeable)}finally {closeable.close()}
}
class Connection{
def close():Unit = println("conn is closed")
}
val conn = new Connection
val res = withClose(conn)(conn=>{println("something is done");12345})
print(res.isInstanceOf[Int]) //true
} //trait:有函数体的interface
trait Foreachable[A]{
def iterator: java.util.Iterator[A]
def foreach(f:A=>Unit):Unit={
val iter = iterator
while(iter.hasNext)
f(iter.next)
}
}
object obj6 extends App{
val list = new util.ArrayList[Int] with Foreachable[Int]
list.add(1)
list.add(2)
list.foreach(x => print(x + ","))
}

ScalaTour-1.基础的更多相关文章

  1. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  2. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  5. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  6. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  7. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  8. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  9. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  10. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

随机推荐

  1. 使用isInEditMode解决可视化编辑器无法识别自定义控件的问题

    如果在自定义控件的构造函数或者其他绘制相关地方使用系统依赖的代码, 会导致可视化编辑器无法报错并提示:Use View.isInEditMode() in your custom views to s ...

  2. 1-4-2 Windows数据类型与重要数据结构

    主要内容:介绍Windows数据类型与重要数据结构 1.数据类型 在Windows系统中定义了Windows应用程序中包含种类繁多的数据类型, 部分如下: WORD 16位无符号整数 typedef ...

  3. linux中的find命令——查找文件名

    1.在某目录下查找名为“elm.cc”的文件 find /home/lijiajia/ -name elm.cc 2.查找文件名中包含某字符(如"elm")的文件 find /ho ...

  4. (转)一文学会用 Tensorflow 搭建神经网络

    一文学会用 Tensorflow 搭建神经网络 本文转自:http://www.jianshu.com/p/e112012a4b2d 字数2259 阅读3168 评论8 喜欢11 cs224d-Day ...

  5. 利用redis写webshell

    redis和mongodb我之所见 最近自己在做一些个人的小创作.小项目,其中用到了mongodb和redis,最初可能对这二者没有深入的认识.都是所谓的“非关系型数据库”,有什么区别么? 实际上,在 ...

  6. IntelliJ IDEA currently

    https://www.jetbrains.com/help/idea/2016.2/creating-a-project-from-scratch.html https://www.jetbrain ...

  7. http协议传输二进制数据以及对输入流(php://input)和http请求的理解

    1.index.php <?php $data=file_get_contents('./a.jpg'); $opts = array('http' => array( 'method' ...

  8. 免费web api接口大全

    下面的接口来自互联网,部分功能需要付费 查询手机 http://www.yodao.com/smartresult-xml/search.s?type=mobile&q=手机号码 查询IP h ...

  9. Void 0

    void anything 都返回 undefined , 使用Void 0 ,仅仅是因为习惯而已,所以不必介怀. 比较好的写法应该是 void(0)

  10. 自定义Mvc5 Owin 验证

    public class AuthIn : IUserAuthenticate { public static ApplicationUserManager UserManager { get { r ...