为什么选择Scala?

原文地址: http://www.infoq.com/cn/news/2008/01/why-scala

在回答“为什么选择Scala?”这个问题之前,我们首先需要回答“什么是Scala?”。从[url=http://www.scala-lang.org/]Scala网站[/url]上,可以找到如下概述:

[quote]Scala是一门现代的多范式编程语言,志在以简练、优雅及类型安全的方式来表达常用编程模式。它平滑地集成了面向对象和函数语言的特性。
Scala是面向对象的:Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。
Scala是函数式的: Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher-order)函数、允许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中都被使用。
Scala是静态类型的:Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。
Scala是可扩展的:Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:
任何方式可以被用作中缀(infix)或后缀(postfix)操作符
闭包按照所期望的类型(目标类型)自动地被构造
两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。
Scala可与Java和.NET进行互操作:Scala设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 .NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载类),允许访问成千上万的高质量类库。 [/quote]
对于某些开发者来说,这些刺激已足以引诱他们脱离Java进入Scala世界。但对另外一些开发者来说,它们并没有为Java世界里当前正在演绎的日复一日的编程活动提供更多好处。

在一篇名为“[url=http://locut.us/blog/2007/12/18/scala-the-best-of-both-ruby-and-java/]Scala:集Ruby和Java之所长[/url]”的博文中,Ian讲述了或许不应在Java和Scala之间做出选择,相反,相对于选择其它语言如Ruby,选择使用Java和Scala的混合物是的另一种选择:

许多开发者热爱Ruby,不过他们不能从中获取足够的东西。它可能是最具侵略性的语言之一,因为Java才是第一个到场的。人们总是引证Ruby的灵活而可扩展的语法、闭包等特性,以及其代码如何简明和具有表现力。

例如,你可以用一个简单语法创建一个Map(Ruby称之为“hashes”,尽管hashtable只是map一种可能的实现方式),如:

numberMap = {"one" => 1, "two" => 2, "three" => 3}
Java与之对等的语句显得颇为冗长:

Map<String, Integer> numberMap = new HashMap<String, Integer>(); numberMap.put("one", 1); numberMap.put("two", 2); numberMap.put("three", 3);
那么Scala怎么样呢?让我们看看Scala中map的例子:

var numberMap = Map("one" -> 1, "two" -> 2, "three" -> 3)
你会注意到它看上去非常类似等价的Ruby代码,但是这儿有一些重要区别。特别是,就像Java,Scala编译器知道numberMap使用String作为键,Integer作为值。与Java不同的是,你无需告知,它本身就能领会这一点!这称为“类型推理(type inference)”。

这意味着如果你试图给numberMap增加一个新的键值对,但是要使用Integer作为键,String作为值,Scala将在你试图编译它时立刻报错(或者你的IDE将立刻警告你)。使用Ruby,只有当你运行你的软件并试图从该Map中找回该键和值时,得到的分别是Integer和String而不是所期望的String和Integer,这时才会导致报错。

过分强调编译时类型检查节省多少多少时间是困难的,但它消除了所有类在执行时将会产生的bug。Scala给你带来了这一好处,而且代码并不繁琐。

为更进一步在一个小例子中展现代码量的缩减,Ted Neward研究了开发同一个类,用Java、C#、Virual Basic、Ruby和Scala的区别。请参考其博文Scala pt 2:简短。

Ian继续指出:

Scala还有一连串其它好的Ruby特性(Java所缺乏的),包括闭包,以及非常适合“领域特定语言”的可塑性语法。它拥有所有这些特性,而且结合了静态类型好处。
David MacIver在其博文说正经的,为什么选择Scala?中分享了他对于面向对象编程、面向模块编程、静态类型、函数编程以及该语言中他所喜欢的未言明特性的观点。他补充道:


Scala离完美还差得远。它有一些语法缺陷,一些由Java带来的问题,一个有适度问题的编译器以及一堆你记不住的琐碎特性和边界情况(edge case)。然而,我发现这些问题除了烦你之外并不真正产生什么后果。如果只是想坐下来书写好的代码,该语言的核心是强大的和非常有用的。
为了提供一个均衡的观点,David在其博文中接着探讨了为什么不选Scala,文中他阐述了一些边界情况(edge case)。作为总结,David有如下评论:


总而言之,我发现这些只是增加了一些烦心事。它仍是我最喜欢的JVM语言,但是你的看法将取决于你怎样搁置那些对你来说可能是更重要的需要优先考虑的事情。
为了展现Scala是一门不断成熟的语言,Programming in Scala一书很快将会出版。如果等不及,Artima网站上有该书PDF格式的预印版。


做出自己的决定,或想学习更多关于Scala内容,请关注他们的网站。
【实战分享】构建企业级RAG(Retrieval-Augmented Generation)知识库的全面实践 大模型指的是训练参数量极其庞大的深度学习模型,如GPT-3、GPT-4等。这些模型能够通过海量的数据学习,具备强大的语言理解和生成能力。在问答系统中,大模型能够理解用户提出的问题,并生成相关的回答。"""添加文档向量"""pass"""相似度检索"""pass"""获取页面分段"""passMilvus是一个开源的向量数据库,专为高效的向量存储和检索设计。Milvus支持多种索引方式(如IVF、HNSW等),并提供高效的查询和检索功能。索引构建:Milvus通过创建索引加速查询速度。 阅读详情

相关推荐

SNAP实战:哨兵1 SLC数据预处理全流程详解(附避坑指南)

本文详细解析了使用SNAP软件处理哨兵1号SLC数据的完整预处理流程。从轨道精校正、辐射定标到多视与斑点滤波,再到地理编码,文章提供了清晰的操作步骤与核心逻辑,并重点分享了实践中的常见“坑”与解决方案,旨在帮助用户高效、准确地完成SAR数据预处理。

7up55的博客 1029

点评Scala语言适合干什么

在计算机编程领域,每种都有其特点和适用场景,不同的语言在不同的领域中会有不同的表现。就是这样一种语言,它结合了面向对象和函数式编程的特点,使其在某些特定领域表现出色。那么 Scala 到底适合干什么呢?

y632481222的博客 1084

UG NX 12.0零基础实战:从草图绘制到三维建模全流程解析

本文详细解析UG NX 12.0从草图绘制到三维建模的全流程,适合零基础用户快速掌握这款工业设计软件。内容涵盖界面设置、基础操作、草图技巧、拉伸旋转建模、布尔运算等核心功能,并通过机械零件实战案例演示完整设计流程,帮助读者系统学习UG NX 12.0的工业设计应用。

weixin_29261711的博客 1183

为什么要用scala?

3、能融合到Hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。2、速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多。1、优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。

bfhcchfcj的博客 245

IMU数据处理避坑指南:从理论到实践的加速度计重力消除方案

本文详细解析了IMU数据处理中的重力消除技术,从理论基础到实践应用,涵盖了加速度计和陀螺仪的核心问题。通过ROS2实战案例,介绍了静态标定与动态校准的技术对比,以及多传感器融合的进阶策略,帮助开发者避免常见陷阱,提升IMU数据处理的精度和效率。

purple的博客 741

SDK报错(1)undefined reference to `f_mount‘

按文中说法是ff.c文件中用了一个if语句来判断是否启用ff.h头文件,但是却没有地方进行宏定义来满足这个if条件。利用SDK读取sd卡时,添加了xilffs库,而且包含了ff.h头文件,还是对fat库的函数报错。网上有的说在ARM v7 gcc linker中添加xilffs的方法可以解决,但我试了没有用。如下图,我们可以在ff.c中自己添加一个宏定义来实现这个条件。最后在赛灵思论坛找到了一个解决方法,原文连接如下。这时候保存编译之后,报错就消失了。ff.c 文件在bsp工程下。

EfunStudy的博客 1481

大数据技术之Scala语言,只需一篇文章即可,教你学会什么是Scala,教你如何使用Scala

Scala的集合有三大类:序列Seq,集Set,映射Map,所有的集合都扩展自Iterable特质。对于几乎所有的集合类,Scala都同时提供了可变和不可变版本,可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变,所以这里的不可变并不是变量本身的值不可变,而是变量指向的那个内存地址不可变。

m0_73745224的博客 7182

FPGA控制DDR读写(AXI4总线接口)

FPGA控制DDR读写

qq_42712308的博客 1万+

Scala的概述及特点

目录 一、大数据为什么学习Scala 二、Scala起源 三、Scala特点 1.面向对象 2.函数式编程 3.静态类型 4.扩展性 5.动态性 四、什么是函数式编程 函数式编程的特点: 函数式编程优势: 五、什么是静态语言和动态语言 六、什么是强类型和弱类型语言 一、大数据为什么学习Scala 1.优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。 2.速度快:Scala语言表达能力强,一行代码抵得...

CyAurora的博客 7897

C#实现跨域访问共享文件夹的账号密码验证方案

本文详细介绍了在C#中实现跨域访问共享文件夹的账号密码验证方案。通过调用Windows API LogonUser函数,结合LOGON32_LOGON_NEW_CREDENTIALS登录类型,可安全模拟指定用户身份,有效解决工作组与域环境间的文件共享访问难题。文章提供了完整的工具类封装、多种实战场景示例及详细的错误排查指南。

pea55的博客 542

UG NX二次开发(C#)-读取PMI对象的名称

摘要:本文介绍了在UG NX中通过NXOpen获取PMI对象名称的方法。首先说明PMI对象初始无名称,可通过重命名或属性设置名称。然后提供C#代码示例,展示如何遍历PMI集合获取对象名称,并显示名称和类型信息。适用于需要操作PMI对象的开发人员,欢迎加入技术交流QQ群749492565。(99字)

GimiGimmy 592

【Scala】初识Scala:为什么选择Scala进行大数据开发?

Scala,全称为 Scalable Language,由瑞士联邦理工学院的 Martin Odersky 于 2003 年设计并发布。Scala 运行在 JVM(Java 虚拟机)之上,能够无缝集成 Java 生态系统。其设计初衷是结合面向对象编程和函数式编程的优点,提供更高效、更简洁的代码表达能力。

weixin_52938153的博客 1191

npm报错 npm WARN deprecated....的问题解决方式

报错 :npm WARN deprecated … 现象:无法进行有效的vue项目的部署以及npm install 命令的执行。 原因一:版本问题 说明:由于npm的版本过低或者过高导致的报错 检查版本: npm -v 如果版本是比较旧的,或者是最新的,这里可以进行对npm的更新和回退。 更新npm版本: npm updated -d 查看可以更新的版本 npm install -g npm 默认安装最新版本 安装回退指定的版本: npm updated -d 查看所有的版本 npm -g i.

任聪聪的博客 16万+

scala编程--1为什么选择scala

为什么选择scala 1.scala是兼容的 他被设计成无缝的与Java实施或操作。 scala程序会被编译成JVM的字节码。他们的执行期性能通常与Java程序一致。 scala程序可以调用Java的方法,访问Java的字段,实现Java的接口。 几乎所有的scala代码都极度依赖Java库,而经常无须程序员意识到这一点。 交互式操作的另一点是scala极度重用了Java类型。

饮马天涯 1068

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

为什么选择Scala

如果你是一名Java程序员,并且关注这编程语言方面的发展,比如经常去TIOBE网站了解编程语言流行度排行,那么你应该听说过Scala,如果你还没有开始学习Scala,或者打算下个礼拜开始学的话,请先看看下面这篇文章,看看能不能改变你的想法。下面的内容为Programming In Scala 这本书的节选,到目前为止,国内好像还没引进,你可以从亚马逊上面购买http://booksites.art...

liuyaoxing的专栏 166

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

为什么选择学习Scala

Scala 结合了面向对象编程和函数式编程的特性,使其既具有 Java 的稳健性,又具备 Haskell 的简洁和灵活性。Scala 兼容 Java,运行在 JVM 上,这意味着你可以无缝地使用 Java 库。此外,Scala 是 Apache Spark 的主要编程语言,这使其在大数据处理领域占据了重要地位。

wzdsajn的博客 125

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

为什么选择Testcontainers-scala?解决Scala集成测试痛点的终极方案

Testcontainers-scala是一个专为Scala开发者打造的测试工具,它通过Docker容器化技术,为集成测试提供了简单、可靠且一致的环境。无论是数据库、消息队列还是缓存服务,Testcontainers-scala都能轻松管理,让开发者专注于测试逻辑而非环境配置。 ## 🧩 Scala集成测试的常见痛点 在传统的Scala集成测试中,开发者常常面临以下挑战: - **环境不一

gitblog_01170的博客 901

Requests-Scala vs 其他Scala HTTP客户端:为什么选择它?终极对比指南

在Scala生态系统中选择HTTP客户端时,开发者常常面临多种选择。Requests-Scala作为Python Requests库的Scala移植版本,提供了独特而强大的解决方案。本文将为您详细对比Requests-Scala与其他主流Scala HTTP客户端,帮助您做出明智的选择。 ## 为什么Scala开发者需要优秀的HTTP客户端?🤔 现代Web开发离不开HTTP通信,无论是调用R

gitblog_00856的博客 1000

为什么选择学习 Scala

Scala 结合了面向对象编程和函数式编程的特性,使其既具有 Java 的稳健性,又具备 Haskell 的简洁和灵活性。Scala 兼容 Java,运行在 JVM 上,这意味着你可以无缝地使用 Java 库。此外,Scala 是 Apache Spark 的主要编程语言,这使其在大数据处理领域占据了重要地位。

bfhcchfcj的博客 120

spark底层为什么选择使用scala语言开发

集成性:Scala 是一种运行在 Java 虚拟机(JVM)上的静态类型编程语言,可以与 Java 代码无缝集成。由于 Spark 涉及到与大量 Java 生态系统的交互,例如 Hadoop、Hive 等,使用 Scala 可以方便地与这些组件进行集成和交互。函数式编程支持:Scala 是一种面向函数式编程的语言,提供了丰富的函数式编程特性,如高阶函数、闭包等。这些特性使得编写复杂的数据处理逻辑变得更加简洁和灵活,而大规模数据处理正是 Spark 的核心任务之一。

m0_46168848的博客 2042

为什么选择scala而不用java开发spark

你可能会认为我根本无法对前面一小节那个畸形的函数给出个合理的解释。我开始学习函数式编程时就是这么认为的。不过我是错了。有很好的理由使用这种风格,当然其中一些属主观因素。例如,函数式程序被认为更容易阅读。因为连街上乱跑的娃娃都知道,是否容易理解是个见仁见智的判断,所以我将略去这些主观方面的理由。幸运的是,还有很多的客观理由。 单元测试 因为函数式编程的每一个符号都是 final 的,没有函数产生...

carrots 3008

为什么选择Scala?大数据开发从入门到精通

在大数据和分布式计算领域,Scala语言因其强大的功能、简洁的语法和与Java的良好兼容性,成为了越来越多开发者的选择。那么,为什么选择Scala?本文将带你全面了解Scala,从语言的基本概念、语法结构到实际应用,帮助你快速入门并掌握Scala在大数据开发中的独特优势。

920

Airframe核心功能解析:为什么它是Scala项目的理想选择

Airframe是Scala应用开发的必备构建模块集合,提供了日志记录、JSON/MessagePack对象序列化、依赖注入、带RPC支持的HTTP服务器/客户端以及AirSpec功能测试等组件。本文将深入解析Airframe的核心功能,展示它如何成为Scala项目的理想选择。 ## 为什么选择Airframe? 在Scala开发中,我们常常需要整合各种库来满足不同需求,这可能导致依赖管理复杂

gitblog_00714的博客 637

为什么选择 Scala Pickling?5 大核心优势彻底解析

Scala Pickling 是一个为 Scala 语言提供快速、可定制且无样板代码的序列化库。它通过创新的设计解决了传统序列化方案的性能瓶颈和代码冗余问题,成为 Scala 生态中数据持久化与传输的理想选择。 ## 1. ⚡ 卓越性能:基准测试验证的速度优势 Scala Pickling 在性能上的表现令人印象深刻,其设计专注于高效的对象转换。项目中的基准测试框架([benchmark/Be

gitblog_00160的博客 449

为什么选择Scala Native:10个理由让你爱上原生编译

Scala Native是将Scala语言编译为原生代码的终极解决方案,让您最喜爱的语言更接近底层硬件。这款强大的工具通过Ahead-of-Time(AOT)编译技术,将Scala代码直接转换为高效的原生二进制文件,彻底摆脱JVM的束缚。🚀 ## 💡 惊人的性能提升 Scala Native在计算密集型任务中展现出卓越的性能表现。通过原生编译,您的Scala应用程序可以直接在目标平台上运行

gitblog_00848的博客 715
上一篇: JAVA比C++更快?
下一篇: Scala—Java的避难所:第一部分:main(String[])
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值