scala编程,《scala编程中文版》pdf下载在线阅读全文,求百度网盘云资源
scala编程,《scala编程中文版》pdf下载在线阅读全文,求百度网盘云资源详细介绍
本文目录一览: Scala编程语言简介
Scala编程语言近来抓住了很多开发者的眼球 如果你粗略浏览Scala的网站 你会觉得Scala是一种纯粹的面向对象编程语言 而又无缝地结合了命令式和函数式的编程风格 Christopher Diggins认为
不太久之前编程语言还可以毫无疑义地归类成 命令式 或者 函数式 Scala代表了一个新的语言品种 它抹平了这些人为划分的界限
根据David Rupp在博客中的说法 Scala可能是下下一代Java 这么高的评价让人不禁想看看它到底是什么东西
Scala有几项关键特性表明了它的面向对象的本质 例如 Scala中的每个值都是一个对象 包括基本数据类型(即布尔值 数字等)在内 连函数也是对象 另外 类可以被子类化 而且Scala还提供了基于mixin的组合(mixin based position)
与只支持单继承的语言相比 Scala具有更广泛意义上的类重用 Scala允许定义新类的时候重用 一个类中新增的成员定义(即相较于其父类的差异之处) Scala称之为mixin类组合
Scala还包含了若干函数式语言的关键概念 包括高阶函数(Higher Order Function) 局部套用(Currying) 嵌套函数(Nested Function) 序列解读(Sequence Comprehensions)等等
Scala是静态类型的 这就允许它提供泛型类 内部类 甚至多态方法(Polymorphic Method) 另外值得一提的是 Scala被特意设计成能够与Java和 NET互操作 Scala当前版本还不能在 NET上运行(虽然上一版可以) 但按照计划将来可以在 NET上运行
Scala可以与Java互操作 它用scalac这个编译器把源文件编译成Java的class文件(即在JVM上运行的字节码) 你可以从Scala中调用所有的Java类库 也同样可以从Java应用程序中调用Scala的代码 用David Rupp的话来说
它也可以访问现存的数之不尽的Java类库 这让(潜在地)迁移到Scala更加容易
这让Scala得以使用为Java 或者 编写的巨量的Java类库和框架 Scala会经常性地针对这几个版本的Java进行测试 Scala可能也可以在更早版本的Java上运行 但没有经过正式的测试 Scala以BSD许可发布 并且数年前就已经被认为相当稳定了
说了这么多 我们还没有回答一个问题 为什么我要使用Scala? Scala的设计始终贯穿着一个理念
创造一种更好地支持组件的语言 (《The Scala Programming Language》 Donna Malayeri)
也就是说软件应该由可重用的部件构造而成 Scala旨在提供一种编程语言 能够统一和一般化分别来自面向对象和函数式两种不同风格的关键概念
藉著这个目标与设计 Scala得以提供一些出众的特性 包括
* 面向对象风格
* 函数式风格
* 更高层的并发模型
Scala把Erlang风格的基于actor的并发带进了JVM 开发者现在可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序 它会自动获得多核心处理器带来的优势 而不必依照复杂的Java线程模型来编写程序
* 轻量级的函数语法
o 高阶
o 嵌套
o 局部套用(Currying)
o 匿名
* 与XML集成
o 可在Scala程序中直接书写XML
o 可将XML转换成Scala类
* 与Java无缝地互操作
Scala的风格和特性已经吸引了大量的开发者 比如Debasish Ghosh就觉得
我已经把玩了Scala好一阵子 可以说我绝对享受这个语言的创新之处
lishixinzhi/Article/program/Java/hx/201311/26873
scala开发web的好处?
Scala 是一种灵活且高效的编程语言,它具有许多优势可以用于 Web 开发。以下是 Scala 在 Web 开发中的一些好处:
面向对象编程和函数式编程的结合:Scala 不仅支持面向对象编程,还支持函数式编程,这使得它能够更好地处理复杂的 Web 应用程序。
可扩展性:Scala 可以与 Java 代码无缝集成,这使得它能够利用 Java 生态系统中的各种库和框架,从而提高了 Web 应用程序的可扩展性。
高性能:Scala 是一种编译型语言,因此它可以生成高效的字节码。这使得 Web 应用程序能够在运行时快速执行。
强类型检查:Scala 的类型系统非常强大,可以在编译时捕获许多错误。这有助于提高代码质量并减少调试时间。
并发性:Scala 具有内置的并发支持,这使得它能够轻松处理高并发的 Web 应用程序。
总的来说,Scala 是一种非常适合 Web 开发的语言,它具有高性能、可扩展性、并发性和强类型检查等优点。
数据分析常用的编程语言有哪些
数据分析常用的编程语言有Python、R、SQL、Scala、Julia。
编程是软件开发的基础,大数据分析是包括计算机科学在内的多个领域的集合。它涉及科学过程和方法的使用,以分析数据并从中得出结论。为此角色设计的特定编程语言将执行这些方法。为了成为熟练的大数据分析家,必须掌握以下大数据分析编程语言。
1、Python
它是易于使用的基于解释器的高级编程语言。Python是一种通用语言,具有用于多个角色的大量库。由于其易于学习的曲线和有用的库,它已成为大数据分析最受欢迎的选择之一。Python观察到的代码可读性也使它成为Data Science的流行选择。
由于大数据分析家可以解决复杂的问题,因此拥有一种易于理解的语言是理想的。Python使用户更容易在遵循所需算法标准的同时实现解决方案。
Python支持多种库。大数据分析中解决问题的各个阶段都使用自定义库。解决大数据分析问题涉及数据预处理,分析,可视化,预测和数据保存。为了执行这些步骤,Python拥有专用的库,例如–Pandas,Numpy,Matplotlib,SciPy,scikit-learn等。
此外,高级的Python库(例如Tensorflow,Keras和Pytorch)为大数据分析家提供了深度学习工具。
2、R
对于面向统计的任务,R是理想的语言。与Python相比,有抱负的大数据分析家可能不得不面对陡峭的学习曲线。R专门用于统计分析。因此,它在统计学家中非常受欢迎。如果您想深入了解数据分析和统计信息,那么R是您选择的语言。R的唯一缺点是它不是通用编程语言,这意味着它不用于统计编程以外的任务。
R在CRAN的开放源代码存储库中有10,000多个软件包,可满足所有统计应用程序的需求。R的另一个强项是它处理复杂线性代数的能力。这使得R不仅适用于统计分析而且适用于神经网络。R的另一个重要功能是其可视化库ggplot2。
还有其他工作室套件,例如tidyverse和Sparklyr,它们为Apache R提供基于Apache Spark的接口。RStudio等基于R的环境使连接数据库变得更加容易。它具有一个称为“RMySQL”的内置软件包,该软件包提供R与MySQL的本地连接。所有这些功能使R成为核心大数据分析家的理想选择。
3、SQL
SQL被称为“大数据分析的关键”,SQL是大数据分析家必须具备的最重要技能。SQL或“结构化查询语言”是用于从称为关系数据库的有组织数据源中检索数据的数据库语言。在大数据分析中,SQL用于更新,查询和操作数据库。
作为大数据分析家,了解如何检索数据是工作中最重要的部分。SQL是大数据分析家的“辅助武器”,这意味着它提供的功能有限,但对于特定角色至关重要。它具有多种实现,例如MySQL,SQLite,PostgreSQL等。
4、Scala
Scala stand是在JVM上运行的Java编程语言的扩展。它是一种通用编程语言,具有面向对象技术和功能编程语言的功能。您可以将Scala与大数据平台Spark结合使用。当处理大量数据时,这使Scala成为理想的编程语言。
Scala提供了与Java的完全互操作性,同时与Data保持了紧密的联系。作为大数据分析家,必须对使用编程语言充满信心,以便以所需的任何形式雕刻数据。Scala是专门为此角色创建的高效语言。Scala的最重要特征是其促进大规模并行处理的能力。但是,Scala的学习曲线比较陡峭,我们不建议初学者使用。
5、Julia
Julia是最近开发的编程语言,最适合科学计算。它像Python一样简单,因此广受欢迎,并且具有C语言的迅捷性能。这使Julia成为需要复杂数学运算的领域的理想语言。作为大数据分析家,您将研究需要复杂数学的问题。Julia能够以很高的速度解决此类问题。
尽管Julia由于其最新开发而在其稳定版本中遇到了一些问题,但它现在已被广泛认可为人工智能语言。
学编程要什么书
要成为程序员,不仅需要大量的实践,同时也要具备丰富的理论知识。下面分享8本书《代码整洁之道》、《程序员修炼之道:从小工到专家》、《重构——改善既有代码的设计》、《Java并发编程实战》、《设计模式:可复用面向对象软件的基础》、《微服务架构设计模式》、《Scala编程(第3版)》、《算法导论(第3版)》。这些书通过介绍大量的理论知识和实际案例,能够为编程初学者提供灵感,从理论走向实践。1.《代码整洁之道》作者:Robert C. Martin程序员的工作不仅仅是要知道如何写代码,理解并代码同样重要。初学者需要从理解代码开始,掌握代码的理论基础。因为一旦形成了代码风格,在之后很难进行改动。如果在初期可以掌握识别不好的代码的能力,并将其转换为干净的代码,之后才能有效地进行编码。书中认为,代码的质量与其整洁度成正比。干净的代码可以为后期的维护和升级奠定良好的基础。这本书为代码清理和软件开发提供了宝贵见解,废除了许多的方法和规范,并通过实际案例进行详细的说明,是适合初学者乃至专业程序员的最经典的编程书之一。2.《程序员修炼之道:从小工到专家》作者:Andrew Hunt/Dave Thomas在具备丰富的理论知识之后,学会如何将理论运用于实践显得更加重要。而这本《程序员修炼之道》则完美的符合这一需求。本书由Andrew Hunt和Dave Thomas合著,以用户的需求为中心,旨在用最为简洁的代码完成达成最大的目标。该书重在从实际角度而不是理论上解决问题,在过去几十年里一直是入门编程的书籍之一,帮助了许许多多的开发人员。这本书注重实际,风格幽默且浅显易懂,能够照顾到刚学习编程的程序员,其中全面阐释了从编码到调试以及测试的内容。不管是初学者还是颇有经验的程序员,这本书都能让他们收获良多,每次阅读都会有新的收获。3.《重构——改善既有代码的设计》作者:Martin Fowler随着编程的不断发展,重构逐渐成为编码世界中的常见技术。编写后的代码势必不是一成不变的,需要不断对其完善,而在这个过程中,即使是微小的改变也会导致一连串的错误。因此,本书介绍了重构的概念以及如何有效的进行重构,以更为有效地进行编程,避开常见的错误。书中提到了60多种重构方式,为程序员提供重构参考。4.《Java并发编程实战》作者:Brian Goetz/Tim Peierls/Joshua Bloch/Joseph Bowbeer/David Holmes/Doug Lea如果想要了解Java多线程与并发相关的知识,并对Java多线程进行全面的了解,这本书绝对是初次涉及Java并发编程的不二之选。即使是在Java的高频率更新下,《Java并发编程实践》依旧是Java开发人员的必读书目,是想学习Java多线程的人不可错过的经典书籍。书中涵盖了Java并发中几乎所有的基础知识点,并通过对实际案例的讲解,帮助程序员夯实基础。5.《设计模式:可复用面向对象软件的基础》作者:Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides设计模式可以氛围创建型、结构型以及行为型,设计模式使得程序员能够实现重复使用复杂的组建,从而减少代码的空间。四位作者均为面向对象软件方面的专家,在这一领域积累了丰富的经验,此书是他们对于代码开发经验的总结,他们从设计中挑选出了23个设计模式,结合实际案例,总结出在面向对象设计中最为实用的设计,以供初学者以及专业人士参考。6.《微服务架构设计模式》作者:Chris Richardson微服务如今无处不在,过去几十年来,许多公司正通过Java编程语言从单体应用改造为微服务。本书作者由微服务架构的先驱克里斯·查理森进行编写,共12章,分为概念篇、开发篇、运维篇和实战篇,从设计到实现、测试和集成都做了非常详细的描述,从基础到进阶手把手教初学者如何开发和部署微服务架构应用,是一本权威的微服务实用指南。同时书中提供了大量的架构设计模式,帮助程序员更好地进行理解,从而有效实现微服务。7.《Scala编程(第3版)》作者:Martin Odersky/Lex Spoon/Bill VennersScala是一门现代的多范式编程语言,旨在以简练的方式表达常用的编程模式。Scala不仅支持面向对象编程,同时还支持函数式编程,近年来受到了越来越多人的欢迎。本书由直接参与Scala编程语言开发的马丁·奥德斯基编写,对Scala进行了详尽的介绍,提出了非常新颖的概念,可帮助掌握了一定编程经验的程序员学习。即便是不直接使用Scala的程序员,也能从《Scala编程(第3版)》学到大量关于函数式和面向对象的编程概念和技巧。8.《算法导论(第3版)》作者:Thomas H.Cormen/Charles E.Leiserson/Ronald L.Rivest/Clifford Stein算法作为编程当中的重要部分,是程序员不可或缺的技能之一。通过算法来处理复杂的任务是开发员的必备技能,对于个人的逻辑能力要求较高。此书结构清晰、内容合理,深入浅出地介绍了多种类型的算法,包括动态规划和贪心算法。通过学习并解决书中的实际案例,我们能够更好地锻炼自己的逻辑能力。当然,这本书由于它非常全面且详尽,为算法方面的巅峰之作,适合在算法上拥有一定基础的程序员进行研读。
《scala编程中文版》pdf下载在线阅读全文,求百度网盘云资源
《scala编程中文版》百度网盘pdf最新全集下载:链接:https://pan.baidu.com/s/16y7fDtZ1NpyhcQul-g98Eg
?pwd=xb3t 提取码:xb3t简介:Scala编程(第3版)由直接参与Scala开发的一线人员编写,因而对原理的解读和应用的把握更加值得信赖。本书面向具有一定编程经验的开发者,目标是让读者能够全面了解和掌握Scala编程语言的核心特性
Scala 是一门怎样的语言,具有哪些优缺点
Scala提供了几乎你能想到的所有编程语言特性:
快速实验: Scala有交互式命令行(REPL), 可以在上面快速的试各种语法和代码。这对学习新特性,或者实验新想法非常有用。(第1章)
一致性: 尽管Scala融合了静态类型系统、面向对象、函数式编程等语言特性,但却很少能看出融合的痕迹。Scala是我见到融合最多语言特性而又不显得杂乱的编程语言之一。
类型安全:Scala创始人是教授,他先带领创建了Java 5编译器,而后觉得Java有太多羁绊而发明了Scala。 Scala编译器和类型系统非常强大,它的目标是尽量把软件错误消灭在编写过程中。 Scala类型系统是图灵完备的,甚至可以在编译期间解决问题。
面向对象: Scala是面向对象的编程语言,所有的变量和方法都封装在对象中,可以把信息封装起来供外部使用。(第2章)
函数式编程:Scala同时又是函数式编程语言,函数可以独立存在,可以定义一个函数作为另一个函数的返回值,也可以接受函数作为函数的参数。这给组合函数带来了很大的便利。如何把面向对象编程形容成搭积木的话,函数式编程就像拼线条,更灵活和更有创意。(第3章)
异步编程: 由于函数式编程提倡变量不可变,使异步编程变得非常容易。同时Scala提供的Future(第5章), 和akka类库(第9-11章),使得异步编程变得非常容易。
基于JVM: Scala会被编译成为jvm bytecode,所以Scala能无缝集成已有的Java类库。你可以非常自然的使用已经存在的非常庞大且稳定的Java类库,比如小巧好用的apache.common.*, 或者Java上的各种工具类库。
因为如此众多特性,用Scala可以优雅地编写简洁的代码,同时又能减少很多低级错误;能快速进行开发,又能保证系统性能、团队协作和长期维护。
此图只说明了Scala高阶函数的优势,Java 8已经拥有部分函数式的能力。
orders.flatMap(o -> o.products)
大数据学习都需要掌握哪些知识?
我们在前文中给大家简单介绍了关于大数据运维师的一些基本技能需求的内容。下面我们就一起来了解一下,在学习大数据的时候不同学习阶段都需要了解哪些知识。
数据存储阶段:SQL,oracle,IBM等等都有相关的课程,天通苑java课程培训机构建议根据公司的不同,学习好这些企业的开发工具,基本可以胜任此阶段的职位。
数据挖掘清洗筛选:大数据工程师,要学习JAVA,Linux,SQL,Hadoop,数据序列化系统Avro,数据仓库Hive,分布式数据库HBase,数据仓库Hive,Flume分布式日志框架,Kafka分布式队列系统课程,Sqoop数据迁移,pig开发,Storm实时数据处理。学会以上基本可以入门大数据工程师,如果想有一个更好的起点,建议前期学习scala编程,Spark,R语言等基本现在企业里面更专业的技能。
数据分析:一方面是搭建数据分析框架,比如确定分析思路需要营销、管理等理论知识;还有针对数据分析结论提出有指导意义的分析建议。
产品调整:经过分析后的数据交由老板和PM经过协商后进行产品的更新,然后交由程序员进行修改(快消类进行商品的上下架调整)。
接着再来了解大数据需要掌握那些技术
Hadoop核心
(1)分布式存储基石:HDFS
HDFS简介入门演示构成及工作原理解析:数据块,NameNode,DataNode、数据写入与读取过程、数据复制、HA方案、文件类型、HDFS常用设置JavaAPI代码演示
(2)分布式计算基础:MapReduce
MapReduce简介、编程模型、JavaAPI介绍、编程案例介绍、MapReduce调优
(3)Hadoop集群资源管家:YARN
YARN基本架构资源调度过程调度算法YARN上的计算框架
离线计算
(1)离线日志收集利器:Flume
Flume简介核心组件介绍Flume实例:日志收集、适宜场景、常见问题。
(2)离线批处理必备工具:Hive
Hive在大数据平台里的定位、总体架构、使用场景之AccessLog分析HiveDDL&DML介绍视图函数(内置,窗口,自定义函数)表的分区、分桶和抽样优化。
大数据和编程,有什么关系
Java是一门编程语言,实现同一个需求有上百种编程语言可以完成,Java之于大数据,就是一种工具罢了。
大数据就是一个行业,实现同一个需求同样有多种工具可以选择,狭义一点以技术的角度讲,各类框架有Hadoop,spark,storm,flink等,就这类技术生态圈来讲,还有各种中间件如flume,kafka,sqoop等等 ,这些框架以及工具大多数是用Java编写而成,但提供诸如Java,scala,Python,R等各种语言API供编程。
所以,大数据的实习需要用到Java,但是Java并不是大数据。
大数据和编程之间有很大的关系。
编程是数据处理的基础:大数据的处理需要使用编程语言来进行,例如Python,Java,Scala等。
编程支持大数据分布式存储和计算:大数据处理经常需要在分布式环境中进行,编程语言支持这样的环境。
编程支持数据分析和挖掘:大数据处理需要进行数据分析和挖掘,编程语言提供了很多工具和库来支持这些操作。
编程支持数据可视化:编程语言提供了很多工具和库来支持数据可视化,可以帮助我们更好地理解和掌握数据。
编程支持机器学习:机器学习是大数据处理的一个重要组成部分,编程语言提供了很多机器学习库和工具。
Scala代码编写中常见的十大陷阱
对于支持并发和分布式处理 高可扩展 基于组件的应用程序来说 Scala的功能是很强大的 它利用了面向对象和函数式程序设计的优点 这种基于Java虚拟机的语言在宣布Twitter正使用它时受到了最多的冲击(相关 CTO评论 从Scala进驻Twitter看多语言混杂系统的前景) 如果使用正确 Scala可以大量减少应用程序对代码的需求
对于Scala编程 我们收集了这些常见代码编写中的陷阱 这些技巧来自于Daniel Sobral 一个曾参加过FreeBSD项目和Java软件开发工程的Scala狂热爱好者
语法错误
认为 yield 像 return 一样 有人会这样写
for(i < to ) {
if (i % == )
yield i
else
yield i
}
正确的表示应该是
for(i < to )
yield {
if (i % == )
i
else
i
}
误用和语法错误
滥用scala xml XML loadXXX 这个的语法分析器试图访问外部的DTD strip组件或类似的东西 在scala xml parsing ConstructingParser fromXXX中有另一个可选的语法分析器 同时 在处理XML时忘记了等号两端的空格 比如
val xml=
这段代码真正的意思是
val xml $equal$less(root) $slash$greater
这种情况的发生是由于操作符相当随意 而且scala采用这样一种事实 字母数字字符与非字母数字字符通过下划线可以结合成为一个有效的标识符 这也使得 x+y 这样的表达式不会被当成一个标识符 而应该注意 x_+ 是一个有效的标识符 所以 赋值标识符的写法应该是
val xml =
用法错误
为那些根本不是无关紧要的应用加入Application特征
object MyScalaApp extends Application {
// body
}
示例部分的问题在于 body部分在单元对象初始化时执行 首先 单元初始化的执行是异步的 因此你的整个程序不能与其它线程交互 其次 即时编译器(JIT)不会优化它 因此你的程序速度慢下来 这是没有必要的
另外 不能与其它线程的交互也意味着你会忘记测试应用程序的GUI或者Actors
用法错误
试图模式匹配一个字符串的正则表达式 而又假定该正则表达式是无界的
val r = (\d+) r
val s = > <
s match {
case r(n) => println( This won t match )
case _ => println( This will )
}
此处的问题在于 当模式模式匹配时 Scala的正则表达式表现为如同开始于 ^ 结束于 $ 使之工作的正确写法是
val r = (\d+) r
val s = > <
r findFirstIn s match {
case Some(n) => println( Matches to +n)
case _ => println( Won t match )
}
或者确保模式能匹配任意前缀和后缀
val r = *(\d+) * r
val s = > <
s match {
case r(n) => println( This will match the first group of r +n+ to )
case _ => println( Won t match )
}
用法错误
把var和val认为是字段(fields)
Scala强制使用统一访问准则(Uniform Access Principle) 这使得我们无法直接引用一个字段 所有对任意字段的访问只能通过getters和setters val和var事实上只是定义一个字段 getter作为val字段 对于var则定义一个setter
Java程序员通常认为var和val是字段 而当发现在他们的方法中它们共享相同的命名空间时 常常觉得惊讶 因此 不能重复使用它们的名字 共享命名空间的是自动定义的getter和setter而不是字段本身 通常程序员们会试图寻找一种访问字段的方法 从而可以绕过限制 但这只是徒劳 统一访问准则是无法违背的 它的另一个后果是 当进行子类化时val会覆盖def 其它方法是行不通的 因为val增加了不变性保证 而def没有
当你需要重载时 没有任何准则会指导你如何使用私有的getters和setters Scala编译器和库代码常使用私有值的别名和缩写 反之公有的getters和setters则使用fullyCamelNamingConventions(一种命名规范) 其它的建议包括 重命名 实例中的单元化 甚至子类化 这些建议的例子如下
重命名
class User(val name: String initialPassword: String) {
private lazy var encryptedPassword = encrypt(initialPassword salt)
private lazy var salt = scala util Random nextInt
private def encrypt(plainText: String salt: Int): String = { }
private def decrypt(encryptedText: String salt: Int): String = { }
def password = decrypt(encryptedPassword salt)
def password_=(newPassword: String) = encrypt(newPassword salt)
}
单例模式(Singleton)
class User(initialName: String initialPassword: String) {
private object fields {
var name: String = initialName;
var password: String = initialPassword;
}
def name = fields name
def name_=(newName: String) = fields name = newName
def password = fields password
def password_=(newPassword: String) = fields password = newPassword
}
或者 对于一个类来说 可以为相等关系或hashCode自动定义可被重用的方法
class User(name : String password : String) {
private case class Fields(var name: String var password : String)
private object fields extends Fields(name password )
def name = fields name
def name_=(newName: String) = fields name = newName
def password = fields password
def password_=(newPassword: String) = fields password = newPassword
}
子类化
case class Customer(name: String)
class ValidatingCustomer(name : String) extends Customer(name ) {
require(name length < )
def name_=(newName : String) =
if (newName length < ) error( too short )
else super name_=(newName)
}
val cust = new ValidatingCustomer( xyz )
用法错误
忘记类型擦除(type erasure) 当你声明了一个类C[A] 一个泛型T[A]或者一个函数或者方法m[A]后 A在运行时并不存在 这意味着 对于实例来讲 任何参数都将被编译成AnyRef 即使编译器能够保证在编译过程中类型不会被忽略掉
这也意味着在编译时你不能使用类型参数A 例如 下面这些代码将不会工作
def checkList[A](l: List[A]) = l match {
case _ : List[Int] => println( List of Ints )
case _ : List[String] => println( List of Strings )
case _ => println( Something else )
}
在运行时 被传递的List没有类型参数 而List[Int]和List[String]都将会变成List[_] 因此只有第一种情况会被调用
你也可以在一定范围内不使用这种方法 而采用实验性的特性Manifest 像这样
def checkList[A](l: List[A])(implicit m: scala reflect Manifest[A]) = m toString match {
case int => println( List of Ints )
case java lang String => println( List of Strings )
case _ => println( Something else )
}
设计错误
Implicit关键字的使用不小心 Implicits非常强大 但要小心 普通类型不能使用隐式参数或者进行隐匿转换
例如 下面一个implicit表达式
implicit def string Int(s: String): Int = s toInt
这是一个不好的做法 因为有人可能错误的使用了一个字符串来代替Int 对于上面的这种情况 更好的方法是使用一个类
case class Age(n: Int)
implicit def string Age(s: String) = Age(s toInt)
implicit def int Age(n: Int) = new Age(n)
implicit def age Int(a: Age) = a n
这将会使你很自由的将Age与String或者Int结合起来 而不是让String和Int结合 类似的 当使用隐式参数时 不要像这样做
case class Person(name: String)(implicit age: Int)
这不仅因为它容易在隐式参数间产生冲突 而且可能导致在毫无提示情况下传递一个隐式的age 而接收者需要的只是隐式的Int或者其它类型 同样 解决办法是使用一个特定的类
另一种可能导致implicit用法出问题的情况是有偏好的使用操作符 你可能认为 ~ 是字符串匹配时最好的操作符 而其他人可能会使用矩阵等价(matrix equivalence) 分析器连接等(符号) 因此 如果你使用它们 请确保你能够很容易的分离其作用域
设计错误
设计不佳的等价方法 尤其是
◆试着使用 == 代替 equals (这让你可以使用 != )
◆使用这样的定义
def equals(other: MyClass): Boolean
而不是这样的
override def equals(other: Any): Boolean
◆忘记重载hashCode 以确保当a==b时a hashCode==b hashCode(反之不一定成立)
◆不可以这样做交换 if a==b then b==a 特别地 当考虑子类化时 超类是否知道如何与一个子类进行对比 即使它不知道该子类是否存在 如果需要请查看canEquals的用法
◆不可以这样做传递 if a==b and b ==c then a==c
用法错误
在Unix/Linux/*BSD的系统中 对你的主机进行了命名却没有在主机文件中声明 特别的 下面这条指令不会工作
ping `hostname`
在这种情况下 fsc和scala都不会工作 而scalac则可以 这是因为fsc运行在背景模式下 通过TCP套接字监听连接来加速编译 而scala却用它来加快脚本的执行速度
风格错误
使用while 虽然它有自己的用处 但大多数时候使用for往往更好 在谈到for时 用它们来产生索引不是一个好的做法
避免这样的使用
def matchingChars(string: String characters: String) = {
var m =
for(i < until string length)
if ((characters contains string(i)) && !(m contains string(i)))
m += string(i)
m
}
而应该使用
def matchingChars(string: String characters: String) = {
var m =
for(c < string)
if ((characters contains c) && !(m contains c))
m += c
m
}
如果有人需要返回一个索引 可以使用下面的形式来代替按索引迭代的方法 如果对性能有要求 它可以较好的应用在投影(projection)(Scala )和视图(Scala )中
def indicesOf(s: String c: Char) = for {
(sc index) < s zipWithIndex
if c == sc
lishixinzhi/Article/program/Java/hx/201311/26022