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 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
随机推荐
- C++ Primer : 第二章:变量和基本类型(1)
变量和基本类型之第一篇:基本内置类型和变量 一. (1) C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16 ...
- c++有默认参数的函数---4
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参. ...
- C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;
ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口: 2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...
- IOS&swift开发常用的网站
swift转OC:http://iswift.org/try OC转swift:https://www.myappconverter.com/ swift语言视频:http://space.bilib ...
- Java设计模式之责任链设计模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...
- JAVA 新闻
Oracle已对Java失去兴趣?Java社区能否扭转乾坤? http://news.cnblogs.com/n/549566/ http://mp.weixin.qq.com/s?__biz=MjM ...
- [unity3d程序] 颜色渐变效果
研究了下,颜色变化时遵从RGB圆环(就是说颜色条对接一下成环)路径最小变化原则.举个例子,加入ABCDE四个颜色点,并且A和E在同一点(转了一圈)设定从A变化到C的话,有两种路径,一种ABC,还一种A ...
- GridView 控制分页页码间距
来源:http://auv2009.blog.163.com/blog/static/68858712200992793853431/ 技巧1:在分页区中改变当前页码的样式或高亮显示页码 一个简单的办 ...
- OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】
/*====================================================================== 扩号匹配问题 总时间限制: 1000ms 内存限制: ...
- css之cursor,float
鼠标形状: 在html中可以任意定义各个标签的显示形状,也可以此用来做些标签显示假像. <body> <p style="cursor: pointer"> ...