ScalaTour-1.基础
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.基础的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
随机推荐
- zboot/piggyback.c
/* * linux/zBoot/piggyback.c * * (C) 1993 Hannu Savolainen */ /* * This program reads the c ...
- 转:linux 修改sftp服务默认提供者sshd的session timeout
ssh连接超时问题解决方案: 1.修改server端的etc/ssh/sshd_config ClientAliveInterval 60 #server每隔60秒发送一次请求给client,然后cl ...
- timus 1109 Conference(二分图匹配)
Conference Time limit: 0.5 secondMemory limit: 64 MB On the upcoming conference were sent M represen ...
- 课堂所讲整理:HTML--6运算符、类型转换
1.类型转换: 分为自动转换和强制转换,一般用强制转换. 其他类型转换为整数:parseint(): 其他类型转换为小数:parsefloat(): 判断是否是一个合法的数字类型:isNaN(): 是 ...
- mysql数据库主从复制部署笔记
主从复制是mysql中数据库实时同步的一个常用做法了,今天我来给各位介绍一下关于mysql数据库主从复制部署一个过程,希望此例子对各位同学参考参考. 数据库主从复制原理: 数据库的主从复制就是从mas ...
- hdu1074 状压DP、栈实现记录路径
题意:给了几门学科作业.它们的截止提交期限(天数).它们的需要完成的时间(天数),每项作业在截止日期后每拖延一天扣一学分,算最少扣的学分和其完成顺序. 一开始做的时候,只是听说过状态压缩这个神奇的东西 ...
- 编码规范(一)之Code Templates的设置(转)
编码规范(一)之Code Templates的设置 基于公司的主流开发工具为eclipse,但每个人都有自己的编码习惯,为了统一格式,这里通过三个方面:设置Code Templates.Checkst ...
- java的nio之:浅析I/O模型
也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗.在 进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型.下面本文先从同步和异步的概念 说起 ...
- Fragment用app包还是v4包解析
转自:http://blog.csdn.net/zc0908/article/details/50721553 1)问题简述 相信很多的朋友在调用Fragment都会遇到下面的情况: 这个时候问题来了 ...
- ogistic regression (逻辑回归) 概述
:http://hi.baidu.com/hehehehello/blog/item/0b59cd803bf15ece9023d96e.html#send http://en.wikipedia.or ...