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 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
随机推荐
- 资源预加载 Preload
当提到前端性能优化时,我们首先会联想到文件的合并.压缩,文件缓存和开启服务器端的 gzip 压缩等,这使得页面加载更快,用户可以尽快使用我们的 Web 应用来达到他们的目标. 资源预加载 是另一个性能 ...
- eBay_Relist(退换刊登费)
如果物品首次刊登结束时没有人中标,或是买家并没有付款完成交易,那么卖家以通过重新刊登的方法来再次销售.如果该物品在第二次刊登时成功售出,且满足eBay的重新刊登退费条件,那么eBay便会退还重新刊登的 ...
- python 批量爬取代理ip
import urllib.request import re import time import random def getResponse(url): req = urllib.request ...
- 关于kafka连接不上别的机器问题Connection refused
1.确认config里面的server.properties 正确(包括IP+端口2181记得看清,用hostname的话记得etc/hostnames下面查看全部配置上没,建议用hostname方便 ...
- (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
- java多线程:java队列详解
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这 ...
- 出现Fatal IO error 11 (资源暂时不可用) on X server :0.0.的可能原因及解决方案
我在使用python的过程当中发现了这个有这样的错误,后来看了下面这篇文档才知道原因所在. 最近在编写一个局域网的聊天工具,在编写客户端时,我把界面部分和事件处理函数写好后,准备再开一个线程用于接收服 ...
- 10046事件跟踪会话sql
背景知识: 10046 事件按照收集信息内容,可以分成4个级别: Level 1: 等同于SQL_TRACE 的功能 Level 4: 在Level 1的基础上增加收集绑定变量的信息 Level 8: ...
- Bitmap 之 getPixels() 的 stride
学习Graphics中遇到位图(Bitmap)中getPixels()方法,对该方法的用法大体理解,但对其中的stride参数却不明白具体的用法以及用意,现记述过程如下: getPixels()方法的 ...
- Nginx重写规则指南 转
http://www.ttlsa.com/nginx/nginx-rewriting-rules-guide/ Nginx重写规则指南 当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你, ...