Scala中级
Scala是一门多范式的编程语言,一种类似java的编程语言 ,设计初衷是实现可伸缩的语言 、并集成面向对象编程和函数式编程的各种特性。
Jeremy_Lee123
AI Everywhere!
展开
-
Scala基础
一、Scala概述1.1、什么是ScalaScala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。为什么要学Scala优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。 速度快:Scala语言表达能力强,一行代码抵得上J...原创 2019-12-08 18:12:06 · 1051 阅读 · 1 评论 -
Scala之数组相关操作
一、定长数组和变长数组package cn.lxk.scalaimport scala.collection.mutable.ArrayBufferobject ArrayDemo { def main(args: Array[String]) { //初始化一个长度为8的定长数组,其所有元素均为0 val arr1 = new Array[Int]...原创 2019-12-08 19:19:47 · 878 阅读 · 1 评论 -
Scala之映射和元组
一个经典的程序员名言是: “如果只能有一种数据结构,那就用哈希表吧。”哈希表一一或者更笼统地说,映射一一是最灵活多变的数据结构之一。一、映射Map在Scala中,把哈希表这种数据结构叫做映射Map。映射里面放的是对偶元组(对偶元组是最简单形式的元组)。1.1、构建映射1.2、获取和修改映射中的值常用getOrElse注意:在Scala中,有两种Ma...原创 2019-12-08 19:28:07 · 630 阅读 · 0 评论 -
Scala之集合
Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区别)一、序列List——有序不可变的序列 import scala.collection.immutable._在Scala中...原创 2019-12-08 19:42:27 · 532 阅读 · 0 评论 -
Scala之高阶函数
本章的要点:在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数;(作为值的函数) 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数应用到集合中的值; 有许多语法上的简写让你以简短且易读的方式表达函数参数; 可以创建操作代码块的函数,像是内建的控制语句Scala混合了面向对象和函数式的特性,我们通常将...原创 2019-12-08 19:53:39 · 764 阅读 · 0 评论 -
Scala之类
本章的要点:类中的字段自动带有getter方法和setter方法。 你可以用定制的getter/setter方法替换掉字段的定义,而不必修改使用类的客户 端一一这就是所谓的“统一访问原则” 。 用@BeanProperty注解来生成JavaBeans的getXxx/setXxx方法。 每个类都有一个主要的构造器,这个构造器和类定义“交织”在一起。 它的参 数直接成为类的字段。 主构造器执...原创 2019-12-08 19:53:13 · 550 阅读 · 0 评论 -
Scala之对象
本章的要点:用对象作为单例或存放工具方法 类可以拥有一个同名的伴生对象 对象可以扩展类或特质 对象的apply方法通常用来构造伴生类的新实例 如果不想显式定义main方法,可以用扩展App特质的对象 你可以通过扩展Enumeration对象来实现枚举一、单列对象在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的存放工具方法和常量 高...原创 2019-12-08 19:53:19 · 487 阅读 · 0 评论 -
Scala之继承
本章的要点:extends,final关键字和Java一样 重写方法时必须使用override 只有主构造器可以调用超类的构造器 可以重写字段一、扩展类 Scala扩展类和Java一样(使用extends关键字),也可以将类声明为final让它不能被扩展,也可以将单个方法或字段声明为final,确保不能重写。 注:Java中final是不可变的(相当于Scala中的v...原创 2019-12-08 19:53:25 · 549 阅读 · 0 评论 -
Scala之模式匹配和样例类
本章的要点:match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你可以对表达式的类型进行匹配;优先选择模式匹配而不是isInstanceOf/asInstanceOf 你可以匹配数组,元祖,样例类的模式,然后匹配到不同部分绑定到变量 在for表达式中,不...原创 2019-12-08 19:53:28 · 574 阅读 · 0 评论 -
Scala之隐式转换和隐式参数
本章的要点:隐式转换用于类型之间的转换 必须引入隐式转换,并确保它们可以以单个标识符的形式出现在当前作用域 隐式参数列表会要求指定类型的对象。它们可以从当前作用域中以单个标识符定义的隐式对象的获取,或者从目标类型的伴生对象获取; 如果隐式参数是一个单参数的函数,那么它同时也会被作为隐式转换使用 类型参数的上下文界定要求存在一个指定类型的隐式对象 如果有可能定位到一个隐式对象,这...原创 2019-12-08 19:53:49 · 591 阅读 · 0 评论 -
01 快学scala第一章--基础
1 简介近期对Scala比较感兴趣,买了本《快学Scala》,感觉不错。比《Programming Scala:Tackle Multi-Core Complexity on the Java Virtual Machine》好很多。 是本不错的入门书。而且每个章节都设置了难度级别,每章有习题,可以巩固Scala语法。本文的目的就是针对这些习题进行解答2 基础2.1 在Scal...原创 2019-08-20 21:27:45 · 575 阅读 · 0 评论 -
02 快学scala第二章--控制结构和函数
2.1一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值简单的逻辑判断def signum(num:Int){if(num>0)print(1)else if(num<0)print(-1)else print(0)}Scala中已经有此方法了,刚才查找API的时候,应该能看到BigI...原创 2019-08-20 21:31:59 · 434 阅读 · 0 评论 -
03 快学scala第三章--数组相关操作
1. 编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0和n之间。objectApp{ def main(args: Array[String]) { makeArr(10).foreach(println); } def makeArr(n : Int) : Array[Int] = { val a = ne...原创 2019-08-20 21:35:29 · 515 阅读 · 0 评论 -
04 快学scala第四章--元组和映射
1 、设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但是价格上打9折 //默认不可变映射 val map = Map("Zeus" -> 10, "KKK" -> 3, "King" -> 0) val map2 = for ((k, v) <- map) yield (k, v * 0.9) f...原创 2019-08-20 22:03:45 · 388 阅读 · 0 评论 -
05 快学scala第五章--类
6 类6.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数加个判断就OK了classCount{privatevarvalue=Int.MaxValuedefincrement(){if(value<Int.MaxValue)value+1elsevalue}defcurrent=va...原创 2019-08-20 22:08:33 · 414 阅读 · 0 评论 -
06 快学scala第六章--对象
7 对象7.1 编写一个Conversions对象,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法Scala代码objectConversions{ definchesToCentimeters(){} defgallonsToLiters(){} defmiles...原创 2019-08-20 22:06:44 · 364 阅读 · 0 评论 -
07 快学scala第七章--包和引入
8.1 编写示例程序,展示为什么package com.horstmann.impatient不同于package compackage horstmannpackage impatient分别使用package的效果如下Scala代码packagecom{ classT1(){} packagehorstmann{ ...原创 2019-08-20 22:27:54 · 413 阅读 · 0 评论 -
08 快学scala第八章--继承
1 、扩展如下的BankAccount类,新类CheckingAccount对每次存款和取款都收取1美元的手续费class BankAccount(initialBalance:Double){private var balance = initialBalancedef deposit(amount:Double) = { balance += amount; balance}...原创 2019-08-20 22:35:17 · 561 阅读 · 0 评论 -
09 快学scala第九章--正则和表达式
文件和正则表达式 10.1 编写一小段Scala代码,将某个文件中的行倒转顺序(将最后一行作为第一行,依此类推) importio.Sourceimportjava.io.PrintWritervalpath= "test.txt"valreader= Source.fromFile(path).getLines()valresult= ...原创 2019-08-20 22:36:42 · 402 阅读 · 0 评论 -
10 快学scala第十章--特质
1 、java.awt.Rectangle类有两个很有用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这样的类没有。在Scala中,你可以解决掉这个问题。定义一个RenctangleLike特质,加入具体的translate和grow方法。提供任何你需要用来实现的抽象方法,以便你可以像如下代码这样混入该特质:val egg = new java...原创 2019-08-20 23:43:25 · 736 阅读 · 0 评论 -
11 快学scala第十一章--操作符
12.1根据优先级规则,3 + 4 -> 5和3 -> 4 + 5是如何被求值的?在REPL中执行即可得到结果。都是从左至右执行12.2BigInt类有一个pow方法,但没有用操作符字符。Scala类库的设计者为什么没有选用**(像Fortran那样)或者^(像Pascal那样)作为乘方操作符呢?Scala中的操作符就是方法,其优先级是根据首字母来判断的,优先级如下最高优先级...原创 2019-08-27 23:50:49 · 422 阅读 · 0 评论 -
12 快学scala第十二章--高阶函数
13.1 编写函数values(fun:(Int)=>Int,low:Int,high:Int),该函数输出一个集合,对应给定区间内给定函数的输入 和输出。比如,values(x=>x*x,-5,5)应该产出一个对偶的集合(-5,25),(-4,16),(-3,9),…,(5,25)object Test extends App { def values(fun: (Int)...原创 2019-08-28 00:01:48 · 522 阅读 · 2 评论 -
13 快学scala第十三章--集合
摘自:https://www.jianshu.com/p/d928a3f450fd1.编写一个函数,给定字符串,产出一个包含所有字符的下标的映射。举例来说:indexes("Mississippi")应返回一个映射,让'M'对应集{0},'i'对应集{1,4,7,10},依此类推。使用字符到可变集的映射。另外,你如何保证集是经过排序的?回答:使用SortedSet可以保证集是经过排序...原创 2019-08-28 00:01:29 · 437 阅读 · 0 评论 -
14 快学scala第十四章--模式匹配和样例类
15.1JDK发行包有一个src.zip文件包含了JDK的大多数源代码。解压并搜索样例标签(用正则表达式case [^:]+:)。然后查找以//开头并包含[Ff]alls?thr的注释,捕获类似// Falls through或// just fall thru这样的注释。假定JDK的程序员们遵守Java编码习惯,在该写注释的地方写下了这些注释,有多少百分比的样例是会掉入到下一个分支的?没读懂...原创 2019-08-28 00:23:45 · 560 阅读 · 0 评论 -
15 快学scala第十五--注解
15.1编写四个JUnit测试用例,分别使用带或不带某个参数的@Test注解。用JUnit执行这些测试import org.junit.Testclass ScalaTest {@Testdef test1(){print("test1")}@Test(timeout = 1L)def test2(){print("test2")}}15.2创建一个类的示例...原创 2019-08-28 00:23:59 · 450 阅读 · 0 评论 -
16 快学scala第十六--XML处理
1. <fred/>(0) 得到什么?<fred/>(0)(0)呢?为什么?回答:<fred/>(0) 得到一个scala.xml.Node,<fred/>(0)(0)也是得到scala.xml.Node。因为scala.xml.Node 实现了方法def apply(i: Int): Node,所以支持串接调用。注意:scala-xm...原创 2019-08-28 00:24:19 · 632 阅读 · 0 评论 -
18 快学scala第十八章--类型参数
1. 定义一个不可变类Pair[T,S],带一个swap方法,返回组件交换过位置的新对偶。packageex17_01objectMainextendsApp{valp=newPair(97->'a')vala=p.swapprintln(a)}classPair[T,S](valp:(T,S)){defswap...原创 2019-08-28 00:24:33 · 419 阅读 · 0 评论 -
19 快学scala第十九章--高级类型
1. 实现一个Bug类,对沿着水平线爬行的虫子建模。move方法向当前方向移动,turn方法让虫子转身,show方法打印出当前的位置。让这些方法可以被串接调用。例如:bugsy.move(4).show().move(6).show().turn().move(5).show()上述代码应显示 4 10 5。packageex18_01classBug{varx=...原创 2019-08-28 00:24:48 · 333 阅读 · 0 评论 -
21 快学scala第二十一章--隐式转换和隐式参数
1. ->的工作原理是什么?或者说,”Hello” -> 42和42 -> “Hello”怎么会和对偶(“Hello”, 42)和(42, “Hello”)扯上关系呢?提示:Predef.any2ArrowAssocimplicit final class ArrowAssoc[A](private val self: A) extends AnyVal { @in...原创 2019-08-28 00:42:45 · 493 阅读 · 0 评论