201. Iterable特质的方法有headlast headOption lastOption tail init length isEmpty map foreach collect flatMap reduceLeft reduceRight foldLeft foldRight reduce fold aggregate sum max min product count forall exists filter filterNot partition takeWhile dropWhile span take drop splitAt takeRight dropRight slice zip zipAll zipWithIndex grouped sliding mkString addString copyToArray copyToBuffer toSeq toArray toList toStream toSet toMap等

202. Seq特质在Iterable基础上又增加了方法,如contains startsWith  endsWith  containsSlice diff  indexOf lastIndexOf indexOfSlice indexWhere prefixLength segmentLength padTo intersect reverse sorted sortWith sortBy permutations combinations等

203. collect方法用于偏函数,即没有对所有可能的值进行定义的函数,它产出被定义的所有参数的函数值的集合,如"-3+4".collect {case '+' => 1; case '-' => -1}得到Vector(-1, 1)

204. reduceLeft和reduceRight都是二元的,如List(1,7,2,9).reduceLeft(_ - _)以及List(1,7,2,9) .reduceRight(_ - _),分别从集合的头部和尾部开始计算,得到-17和-13

205. foldLeft从某个初始值开始构造,而不是从首元素,如List(1,7,2,9).foldLeft(0)(_ - _),得到-19

206. 可以用/:操作符来完成foldLeft功能,如(0/: List(1,7,2,9))(_ - _) ,也得到-19;注意,/:操作符本意是想让你联想到一颗树的样子

207. Scala同样提供:\来完成foldRight功能,比如(List(1,7,2,9):\0)(_ - _),得到-13

208. 任何循环都可以用折叠来代替,比如原本用for循环实现的计算字符串中字母出现频率的代码,可以用折叠改写为,(Map[Char,Int]()/:"Mississippi"){(m,c) => m+(c->(m.getOrElse(c,0)+1))}

209. scanLeft和scanRight将折叠和映射操作结合在一起,得到包含所有中间结果的集合,如(1 to 10).scanLeft(0)(_ + _)得到 Vector(0, 1, 3, 6, 10, 15,21, 28, 36, 45, 55)

210. 拉链zip的用法,如 (prices zip quantities) map {p => p._1 *p._2},其中prices和quantities都是List或Array等集合;如果一个集合比另一个短,那么结果中的对偶数量和较短的元素数量相同

211. zipAll可以指定较短列表的缺省值,如List(5,20,9).zipAll(List(10,2),0.0,1)

212. zipWithIndex返回对偶的列表,其中每个对偶的第二个组成部分是每个元素的下标,如"scala".zipWithIndex得到Vector((s,0), (c,1), (a,2), (l,3), (a,4)),而"scala".zipWithIndex.max._2将得到0,因为s是"scala"中最大的字符

213. 可以用iterator方法从集合获得迭代器,此外Iterable(代表集合)还有一些方法可以产生迭代器比如sliding和grouped。另外,Source.fromFile也能产生一个迭代器,因为将整个文件读取到内存不是很高效的做法。如果觉得迭代器很繁琐,可以用toArray、toSeq、toMap等方法将相应的值拷贝到一个新的集合中

214. #::操作符很像列表的::,但它构造的是流,即stream, 比如def numsFrom(n:BigInt) :Stream[BigInt] =n#::numsFrom(n+1),当执行val s=numsFrom(10)就得到Stream(10, ?)的流对象,表示尾部是未被求值的,当调用s.tail.tail.tail就得到Stream(13, ?)

215. 流的方法是懒执行的,需要调用流•tail来强制对下一个元素求值

216. 如果想一次得到流的多个值,可以先take再force,比如val q=numsFrom(1) map {x=>x*x},然后q.take(5).force,就得到Stream(1, 4, 9, 16, 25),注意:如果直接调用q.force,将会导致oom,因为这是一个无穷流

217. 可以用迭代器来构造流,比如Source.fromFile("...").getLines.toStream

218. 可以对任意scala集合调用view方法,来得到和流一样的懒执行效果,比如首先import scala.math._ 然后val p=(0 until 1000).view.map(pow(10, _))将产生未被求值的集合(哪怕第一个元素也未求值),然后执行p(100)就得到pow(10, 100),就是1.0E100,注意,和流不同,它不会缓存任何值;但和流一样,也可使用force来对懒视图强制求值

219. 懒集合对于处理需要以多种方式进行变换的大型集合是有好处的,它避免了构建出大型中间集合的需要,比如(0 until 1000).view.map(pow(10, _)).map(1 / _).force中的两个map可以同时执行

220. JavaConversions对象提供了用于Scala和Java集合之间转换的一组方法,其中从scala到java的转换方法一般是asJavaxxx,具体有asJavaCollection、asJavaIterable、asJavaIterator、asJavaEnumeration、seqAsJavaList、mutableSeqAsJavaList、bufferAsJavaList、setAsJavaSet、mutableSetAsJavaSet、mapAsJavaMap、mutableMapAsJavaMap、asJavaDictionary、asJavaConcurrentMap;从java到scala的转换方法一般是asScalaxxx,具体有collectionAsScalaIterable、iterableAsScalaIterable、asScalaIterator、asScalaBuffer、 dictionaryAsScalaMap、enumerationAsScalaIterator、asScalaSet、mapAsScalaMap、propertiesAsScalaMap、asScalaConcurrentMap

221. scala类库提供了六个线程安全的集合特质,synchronizedBuffer、synchronizedMap、synchronizedStack、synchronizedPriorityQueue、synchronizedQueue、synchronizedSet,可以混入到相关集合来使之变成同步的;一般来说,最好使用juc的某个类,后者更为高效

222. 假如coll是大型集合,那么coll.par.sum就能并发的求和;par方法产出当前集合的一个并行实现;会尽可能并行执行集合方法,如coll.par.count(_ % 2==0)

223. par还能在for语句中使用,如for(i <- (0 until 100).par) println(i),结果看上去是乱序的

224. par在for yield的结果是有序、依次组装的,如for(i <- (0 until 100).par) yield i

225. 不要在并行运算中修改共享变量,那样会导致结果无法预知,如 var count=0,然后for (c<-(0 until 100).par) {if (c%2==0) count+=1}是错误的!

226. par方法返回的并行集合类型扩展自ParSet/ParSeq/ParMap特质的类型,这些都是ParIterable的子类型,但不是Iterable的子类型,因此不能传给预期为Map/Set/Seq/Iterable的方法

227. 可以用ser方法将并行集合转换回串行版本;也可以被预期为GenMap GenSeq  GenSet  GenIterable类型的方法使用

228. 不是所有方法都可以并行化,如reduceLeft reduceRight等需要考虑先后顺序,并行化要求操作符能自由结合,比如加可以但减不行(一个例子是reduce)

229. 解决不可并行化问题,可用更通用的aggregate方法,它应用于集合的不同部分,并用另一个操作符组合出结果,如"hello".par.aggregate(Set[Char]())(_ + _, _ ++ _)等价于"hello".foldLeft (Set[Char]())(_ + _),都得到Set(h, e, l, o)

230. scala的模式匹配可用在switch语句、类型查询、析构

231. match表达式是更好的switch,不会意外掉入下一个分支;如果没有模式可以匹配,会抛出MatchError,可以用case _来避免

232. 模式中随意定义的条件叫做守卫

233. 类型匹配优先选择模式匹配,而不是isInstanceOf或asInstanceOf,比如case x: String => Integer.parseInt(s),当匹配类型的时候,必须给出变量名,否则会拿对象本身进行匹配;需要区分case _:BigInt和case BigInt,前者指任何类型为BigInt的对象,后者指类型为Class的BigInt对象

234. 注意模式匹配发生在运行期,此时泛型的类型信息已经被擦除,因此不能用类型匹配特定的Map类型,但可以匹配通用的Map,比如case m: Map[String,Int]是错误的,而case m: Map[_, _]是正确的

235. 另外,数组可以匹配具体类型,比如Array[Int]是可以匹配的

236. 要匹配数组的内容,可以使用Array表达式,如case Array(0)匹配只包含0的数组,case Array(x,y)匹配任何包含两个元素的数组,并把两个元素绑定到x和y,而case Array(0,_*)匹配任何以0开头的数组

237.  要匹配列表的内容,可以使用List表达式或::操作符,如case 0::Nil匹配只包含0的列表,case x::y::Nil匹配任何包含两个元素的列表,并把两个元素绑定到x和y,而case 0::tail匹配任何以0开头的列表

238. 匹配元组的内容,可以是case (0,_)以及case(y,0)

239. Option存放可能为空的值,比null更安全

240. Some和None都是Option的子类;Option支持泛型,Some ("fred")的类型是Option(String) ;Map的get也是返回一个Option;可以用isEmpty或者getOrElse来取代case None; 可以将Option当做要么为空,要么只有一个元素的集合,然后使用map filter foreach等操作,例如scores. get("Alice").foreach(println _)

241. scala变量必须以小写字母开头,比如scala.math.Pi就是常量;如果有一个以小写子母开头的常量,必须放在反引号中

242.模式匹配在匹配数组、列表、元组的背后是提取器,即带有unapply和unapplySeq方法的对象,其中unapply提取固定数量的对象,unapplySeq提取一个可长可短的序列;Array的伴生对象就是一个提取器,它定义了unapplySeq方法;提取器不一定是伴生对象,可以是正则表达式对象

243. /%操作返回商和余数的对偶,如val (q,r)=BigInt(10)/%3 将使得q为3,r为1

244. val Array(first,second, _*)=Array(1,2,3,4)将使得first为1,second为2

245. for推导式中可以用带变量的模式,如for((k,v) <- System.getProperties()) println(k+"->"+v);其中失败的匹配将被安静的忽略;也可以使用守卫,要求if在<-之后

246. 样例类是编译器会为之自动产出模式匹配所需方法的类;样例类用于对模式匹配进行优化;样例类的公共超类应该是sealed的

247.样例类是case class,样例对象是case object,二者都可以用match进行模式匹配,其中样例类的实例需要用(),而样例对象不需要;顺便总结一下case关键字的两个用处:1. 样例类和样例对象的构建  2. match case语句模式匹配

248. 样例类定义时会自动发生以下事:1. 构造器的参数都成为val,除非被显式声明为var 2. 伴生对象提供apply方法,你可以不用new来构造对象 3. 提供unapply让模式匹配可以工作 4. 生成equals toString hashCode copy 方法

249. 其余方面,样例类和普通类一样,可以添加字段、方法,以及扩展它们

250. 样例类的copy方法用来构造与现有对象值相同的对象,如amt.copy(),还可以改值,如amt.copy(value=19.19) ,注意,要先定义case class Cur(value:Double, unit:String),再val amt=Cur(23.1,“EUR”)

251. case语句支持中置表示法,如case a Currency u=>... 等价于case Currency(a, u) ;而lst match {case h::t =>…}等价于case ::(h,t),它将调用::.unapply(lst)

252. res match{case p~q=>…}等价于case ~(p,q) ;更复杂的例子:res match{case p~q~r=>…}等价于case ~(~(p,q),r) ;简单总结:中置表示法可用于任何返回对偶的unapply方法

253. 样例类经常被用于嵌套结构,比如商品捆绑打折出售的场景,可以匹配到特定的嵌套,可以用@表示法将嵌套的值绑定到变量,有些时候,_*是必须的,比如注意区分以下两种情况:case Bundle(_,_, art @ Article(_,_), rest @ _*)=>...和case Bundle(_,_, art @ Article(_,_), rest)=>...

254. 样例类+match在某些时候不如多态,因为当增加新的Item,样例类需要回顾所有match语句;某些时候样例类更好,因为模式匹配比继承更简洁,构造不需要new因此更易读,免费得到toString copy equals等方法

255. 样例类适用于那种标记不会改变的结构,比如scala的List就是样例类实现的

256. 如果样例类继承别的样例类,会得到编译器警告,未来可能完全不支持;所以样例类是邪恶的吗?有好有坏吧

257. 当用样例类做模式匹配时,为了让编译器来确保已经列出了所有可能的选择,需要将样例类的超类声明为密封类,即sealed,具体如sealed abstract class Amount,所有样例类都必须在Amount所在文件完成;密封类的所有子类在编译期是已知的,因此可以检查模式语句的完整性

258. 样例类可以模拟枚举,来代替Enumeration助手类

259. 被包含在花括号中的一组case语句是偏函数,即并非对所有输入值都有定义的函数;偏函数是PartitalFunction[A,B]的一个实例,A是参数类型,B是返回类型,它有两个方法,apply和isDefinedAt,可以val f: PartialFunction[Char,Int]={case '+' => 1; case '-' => -1}定义偏函数f,然后调用f('-')就得到-1,而调用f(0)就得到scala.MatchError,另外调用f.isDefinedAt('0')是false

260. scala库的一些特质/类的方法接收偏函数作为参数,包括List、Range、Array、String等的collect方法,具体如(1 to 9).collect {case i if i%2==0  => 0 ;  case _ => 1}

261. scala中可以对类、方法、字段、局部变量、参数、表达式、类型参数以及各种类型定义添加注解;其中表达式和类型的注解跟在被注解的条目之后

262. scala注解形式有@Annotation @Annotation(value) @Annotation(name1=value1,…)

263. @volatile @transient @strictfp @native分别生成等效的java修饰符;而@throws会生成与java兼容的throws规格说明;@deprecated标记已过时的特性

264. @tailrec让你校验某个递归函数使用了尾递归优化

265. assert函数使用了@elidable注解,它的含义是An annotation for methods whose bodies may be excluded from compiler-generated bytecode.

266. 可以对scala类使用java注解,例如JUnit的@Test和JPA的@Entity等;注意:java注解不会影响编译过程,而scala的注解会,比如@BeanProperty注解将触发getter和setter的生成

267. 注解一般加在类、对象、变量、函数的前面,即def class var等前面; 可以同时添加多个注解,先后顺序没有影响

268. 给主构造器(本质是函数)添加注解时,要加在class的后面、函数体的前面,并加上圆括号,比如@Inject()

269. 表达式注解加在后面,比如myMap.get(key):@unchecked,注意,需要在表达式后面加冒号

270. 类型参数的注解格式为class xxx[@specialized T],也是加在前面

271. 实际类型的注解放在类型名称之后,比如String @cps[Unit]

272. 注解可以带参数,如果参数名为value,则名称可以直接略去,如果注解不带参数,则圆括号可以略去;大多数注解的参数都有缺省值,比如Junit的@Test有timeout默认为0

273. java注解的参数可以是字符串、类字面量、java枚举、其他注解、数值型字面量,上述类型的数组(数组的数组除外),而scala的注解参数可以是任意类型,比如@DeprecatedName有一个Symbol类型的参数

274. scala注解必须扩展Annotation特质,可以选择StaticAnnotation或ClassfileAnnotation

275. scala的元注解有@param @field @getter @setter @beanGetter @beanSetter,比如@deprecated注解就是用以上元注解实现的

276. @volatile用于将字段标识为易失的,可被多个线程同时更新;@transient将字段标识为瞬态的,不会被序列化,对于临时保存的缓存数据很有用;@strictfp对应java的strictfp修饰符,将使用IEEE的double值进行计算,而不是80位扩展精度,计算结果更慢,但移植性更高;@native对应java的native,标记用c/c++实现的代码

277. scala用@cloneable和@remote来分别标记可被克隆和远程的对象,而不是Cloneable和java.rmi.Remote ;另外注意@serializable已经过时,应该用scala.Serializable特质;而@SerialVersionUID可用来指定序列化版本

278. 如果从java调用scala方法,因为java要跟踪受检异常,因此要使用@throws来使的java能捕获该异常,如@throws (classOf[IOException]) def read(filename: String){...}

279. @varargs让你从java调用scala的带有变长参数的方法,加在def之前,例如@varargs def process(args:String*)等价于java的void process(String… args)

280. 字段添加@scala.reflect.BeanProperty,将生成javabean风格的getter和setter方法;@BooleanBeanProperty生成带有is前缀的getter方法;此外有@BeanInfo  @BeanDisplayName  @BeanDescription @BeanInfoSkip等

281. @tailrec用于强制编译器进行尾递归优化(即去掉递归,改为循环,节省栈空间),如果它无法这么做,就会报错;@tailrec只能用于private或final的方法

282. 尾递归是"蹦床"的一种特例,即每个函数都返回它自己,scala有一个TailCalls工具可以轻松实现"蹦床" (即scala.util.control.TailCalls),相互递归的函数返回类型为TailRec[A],要么返回done(result),要么返回tailcall(fun),其中fun是下一个被调用的函数

283. @switch检查scala的match语句是否真的被编译成了跳转表,如(n: @switch) match {...};@inline将建议编译器对方法做内联,而@noinline表示不要内联;内联的动作发生在jvm内部,一般无需插手,也有很好的效果

284. @elidable给可以在生产环境删除的代码打上标记,ALL级别表示总是被省略,OFF总是不被省略;此外还有SEVERE、WARNING、INFO、CONFIG、FINE等级别;每个级别对应一个整数常量;该注解需要命令行配合添加-Xelide-below标志,如果不指定该标志,默认@elidable中低于1000的方法会被省略;否则就按-Xelide-below后面设定的级别来执行省略;-Xelide-below OFF表示省略所有方法,而-Xelide-below ALL表示都不省略;因此ALL的别名是MINIMUM,而OFF的别名是MAXIMUM

285. Predef模块定义了assert方法,不匹配的两个参数,会抛出AssertionError;要禁用断言,可以用-Xelide-below 2001或-Xelide-below MAXIMUM;默认不会被禁用;比java断言更强大

286. 最好只对那些没有返回值的方法使用@elidable注解,因为如果用到了被省略方法的返回值,会抛出一个ClassCastException

287. @specialized用于自动生成9种基本类型的重载版本(包括Unit),还可以指定可选类型的子集,比如def xxx[@specialized (Long, Double) T] (x:T, y:T, z:T)= ...

288. @deprecated用于生成告警信息,它有message和since两个可选参数;@deprecatedName用在参数上,如def draw(@deprecatedName('sz)size :Int…),当再次调用draw(sz),会得到名称已过时的告警(注意这里的构造器参数是一个以单引号开头的名称)

289. @implicitNotFound用于某个隐式参数不存在时,生成有意义的错误提示;@unchecked用于匹配不完整时取消告警,就算运行期可能会抛异常; @uncheckedVariance取消与型变相关的错误提示,解决了当scala特质需要扩展java接口,而java的泛型不支持型变带来的报错问题

290. scala.xml.Elem用来表示一个xml元素,如val doc = <html><head></head></html>;而scala.xml.NodeSeq是一系列的节点,如val items = <li>hello</li><li>world</li>; 我这里显示scala.xml.NodeBuffer类型,而NodeBuffer和NodeSeq的关系后面会提到

291. scala的xml类型继承树中,Node类是祖先类型,它的两个最重要的子类是Text和Elem;节点序列类型即NodeSeq,它的本质是Seq[Node];事实上,Node扩展自NodeSeq,表示单个节点等同于长度为1的序列,这种设计方便某些场景,比如既能返回单节点又能返回一系列节点;除Node之外,Document也扩展了NodeSeq

292. XML注释、实体引用、处理指令,都分别对应了一个节点类,叫做Comment、EntityRef、ProcInstr

293. NodeBuffer是一个ArrayBuffer[Node],因此也是Seq[Node],它会被隐式转换为NodeSeq

294. 要处理元素的键值对,可以用attributes属性,它将返回MetaData的对象;之后可以调用text方法、get方法和getOrElse方法、以及asAttrMap方法

295. xml代码块可以包含scala代码块,内嵌的字符串不会被转成Text节点,而是会被转成Atom[String]节点;被内嵌的scala代码可以继续包含xml字面量;甚至可以继续嵌套!

296. 可以在xml属性中使用scala表达式,如<img src={makeURL(fileName)}>,内嵌的代码也能产出节点序列,如<a id={new Atom(1)} .../>

297. 可以在xml字面量使用CDATA标志,来将非xml文本包含到xml文档,会得到Text后代的节点;如果想在输出中带有CDATA,可以使用PCData节点;如果希望被原样保留,可以使用Unparsed节点包含任意文本;还可以使用<xml:group><xml:/group>将一个节点序列归组到单个组节点;当用for yield遍历组时,组内元素会被自动解开

298. NodeSeq提供了类似XPath的/和//操作符的方法,并分别用\和\\代替;其中\定位某个节点或序列的直接后代,如list \ "dt";可使用通配符匹配任意元素,如doc\"body"\"_"\"li";而\\可以定位任意深度的后代,如doc \\ "img";以@开头的字符串可以定位属性,如img\"@alt"返回img节点的alt属性;而doc\\"@alt"返回doc中所有元素的所有alt属性;没有可以用于属性的通配符;doc \\"img" \\"@src"从doc的所有img节点获取所有src属性;\或\\的结果应当做节点序列来遍历,而非单个节点

299. 模式匹配表达式中可以使用xml字面量,如case <img/>=>;可以如下匹配单个后代case <li>{_}</li>=>;匹配任意多的项,如下case <li>{_*}</li>=>;还可以使用变量名,如case <li>{child}</li>=>child.text;注意,case中只能用一个节点,且xml元素中不能有属性;要匹配到属性,得用if守卫

300. scala中xml节点和节点序列是不可变的,如果想编辑节点,必须创建一个拷贝,然后做出修改;拷贝Elem节点,要用copy方法,如list.copy(label="ol"),其中除了label参数,还有attributes、child、prefix、scope;可以利用child参数添加后代;可以用%操作符添加或修改属性,如image% Attribute(null, "alt","xx",Null),甚至可以用嵌套方式添加多个属性;注意:Attribute特质扩展自MetaData;另外,scala.xml.Null是空的属性列表,要区别于scala.Null

Scala入门小纸条(3)相关推荐

  1. Scala入门小纸条(1)

    1. scala的数学操作符实际上是方法,如a+b等于a.+(b) 2. /%是BigInt的一个方法,也就是说,scala的方法名可以用任意字符 3. scala不用强制类型转换,而用方法,比如va ...

  2. 《Scala机器学习》一一1.1 Scala入门

    本节书摘来自华章计算机<Scala机器学习>一书中的第1章,第1.1节,作者:[美] 亚历克斯·科兹洛夫(Alex Kozlov),更多章节内容可以访问云栖社区"华章计算机&qu ...

  3. idea创建Scala入门HelloWorld

    Scala开发环境的搭建 首先到Scala官网下载Scala网址为 https://www.scala-lang.org/download/ 找到下图所示位置:选择相对应的版本的Scala进行下载,这 ...

  4. scala入门_Scala和Scalatra入门–第一部分

    scala入门 在本系列教程中,我们将更深入地研究scalatra. Scalatra是基于轻量级Scala的微型Web框架,可用于创建高性能网站和API. 在第一个教程中,我们将开始安装scalat ...

  5. Scala入门到精通——第十四节 Case Class与模式匹配(一)

    本节主要内容 模式匹配入门 Case Class简介 Case Class进阶 1. 模式匹配入门 在Java语言中存在switch语句,例如: //下面的代码演示了java中switch语句的使用 ...

  6. 九阴真经--scala入门+变量+数据类型+运算符

    一.入门 Spark由scala编写,为后续学习Spark打基础 scala基于java进行开发,把scala代码编译成class文件,运作在jvm上 scala是一种多范式.支持面向对象和函数式编程 ...

  7. scala入门之代码补全

    为什么80%的码农都做不了架构师?>>>    在scala的shell命令行中,我们可以使用像Linux那样的代码补全功能.Linux中是使用Tab键补全,scala的shell命 ...

  8. scala入门基础2

    scala基础之二 课程内容: apply方法 单例对象 函数即对象 包 模式匹配 样本类 try-catch-finally apply 方法 当类或对象有一个主要用途的时候,apply方法为你提供 ...

  9. Scala入门之函数编程

    2019独角兽企业重金招聘Python工程师标准>>> 虽然Twiiter提供了中文版Scala教程:Scala 课堂,但是这只是一个参考书,并不适合Scala初学者,Scala与J ...

  10. Scala入门与进阶(五)- Scala数组

    5. Scala数组 1. 定长数组 scala> val a = new Array[String](5) a: Array[String] = Array(null, null, null, ...

最新文章

  1. Linux多线程的同步-----信号量和互斥锁
  2. 记一次小的51CTO聚会
  3. 数字图像的加载、显示和输出
  4. Webserver推送技术
  5. 操作系统原理:进程 PV 操作如何计算?全网最全三种前驱图计算类型总结
  6. 移动互联网时代,你的个人信息正通过这12种方式泄露
  7. 帮你快速拿Offer!java正则表达式替换指定字符串
  8. 基于c语言客户端的步骤,基于c语言tftp服务器与客户端实现
  9. 又一程序员删库跑路,只不过他没跑掉,还被抓了~
  10. 文档中某些特定数据查询
  11. The remote system refused the connection.
  12. 【项目管理】Java OCR实现图片文字识别
  13. dtcms配置多参数
  14. python将整数转换成二进制形式的方法
  15. 十、【Vue-Router】两个新生命周期钩子 activated/deactivated
  16. Debezium报错处理系列九:“ddl“ : “# Dummy event replacing event type 160 that slave cannot handle.“
  17. 【IoT】 产品设计:结构设计之加胶和减胶
  18. sharepoint 2013 文档库eventhandle权限控制
  19. 我的2018——最美的年龄为最纯的梦想尽最大的努力
  20. Python | 凸多边形间重叠面积计算

热门文章

  1. php漏洞eval,Web安全之代码执行漏洞
  2. 程序人生 - 杭州阶梯摇号是什么意思?
  3. 【C语言经典100例】-- 11 不死神兔问题
  4. Mac上使用微信读书(微信读书网页版)
  5. 通过css布局实现去掉window.print()打印界面的页眉页脚
  6. 小米怎么卸载html,小米11内容中心有什么用?怎么关闭和卸载呢
  7. (三) 图像空间域增强——点运算
  8. 如何内置AdobeFlashPlayer.apk
  9. python代码变成so
  10. OAuth2.0新浪微博开放平台、腾讯社区开放平台