热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Scala学习笔记及与Java不同之处总结从Java开发人员角度

Scala与Java具有许多相似之处,但又有许多不同。这里主要从一个Java开发人员的角度,总结在使用Scala的过程中所面临的一些思维转变。这里只是总结了部分两种语言在开发过程中

  Scala与Java具有许多相似之处,但又有许多不同。这里主要从一个Java开发人员的角度,总结在使用Scala的过程中所面临的一些思维转变。这里只是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方。下面列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码示例及详细阐述见下文。
?

  • Scala中可直接调用Java代码,与Java无缝连接;
  • 语句可以不用“;”结束,且推荐不适用“;”;
  • 变量声明时以var或val开头,可不必指定变量类型,编译器可推断变量类型;
  • 函数可以不定义返回值类型(特殊情况除外);
  • 函数返回值可不用return返回;
  • 无参函数定义及调用时,函数名后可不跟括号;
  • 数组访问下标使用括号,而不用中括号;
  • 元组使用“._n”的方式访问元素,n从1开始;
  • ……。

指定Main函数

  在Java中运行程序,只要指定入口的Main函数即可。一个工程中可以有多个Main函数,每个类内都可以定义Main函数。但是与Java不同的是,Scala工程中,只有定义在object中的Main函数才能作为程序入口,下图中定义在class中的Main函数是无法作为程序入口的。
技术分享
  要想程序能够执行,需要如下图所示,将Main函数定义在object中。在Scala中,class同Java中的类一样,但是Scala中没有static类型的类,与此同时,Scala中提供了一种object的定义方式,通过这种方式定义的“类”类似于Java中的static类,使用时不需要new相应的对象,直接使用外面能访问的变量和函数。object中定义的方法也类似于static方法,直接通过object名访问。
技术分享

变量和字段声明

  与Java中定义变量不同,在Scala中变量是通过“var|val 变量名 [: 类型] = 值”这种方式声明和定义的。在声明字段的时候,可以使用编译器自动推断类型,即不用写“ : 类型”,比如

var i : Int = 2;
或直接
var i = 2;

  var和val的区别是:var声明的变量的值之后还可以改变,而val声明的变量只能在声明时赋值,之后不能改变该变量的值(类似只读变量,但不是常量)。Scala的函数式编程更推荐使用val。

类的定义及不同

  如下图所示,在Scala中也是通过class关键字定义类,看起来与Java中类似。在Scala类中默认的访问符是public,如果不明确的写明private或其他访问符,则类里的成员默认都是可以公开访问的。
技术分享
  但是Scala在构造函数方面与Java存在许多不同,Scala类中包括主构造器和附属构造器。Scala中类的主构造器:主构造器直接跟在类名后面,主构造器中的参数会被编译成类的字段;主构造器执行的时候会执行类中的所有不包含在方法体中的语句;如果在主构造器函数的参数中没有用val或者var去声明变量,那此时的变量是private[this]级别的,只能够被类内部访问。Person类的主构造器如下图所示,主构造器中的参数name和age会被作为Person类的两个成员变量,未被包含在任何方法内部的打印语句会作为主构造器中的语句被执行。
技术分享
  由于上图中定义的age没有使用val或var修饰,所以会被作为private类型的成员变量使用,这类变量只能在类内部访问。因此如下图所示,name能在类外部访问,而age不能被外部访问。
技术分享
  以上是主构造器的情况,Scala中还包括一类附属构造器,即除主构造器外的其他构造函数,附属构造器有以下特点:附属构造器是用this来声明的;附属构造器中必须调用主构造或者其它附属构造器。如下图所示为附属构造器的例子。
技术分享

特别的函数定义

  Scala中的函数定义与Java中有所区别,总体来说如下这种方式,返回值类型在参数列表后面通过“: 类型”这种方式指定,然后通过“=”承接函数体。对于无返回值类型的,类型可以写“Unit”(类似Java中的void),对于函数体简单的,“=”后面可直接接语句,不用“{}”。
技术分享
  与Java不同的是,语句块或函数返回值可以不用显示的通过“return”语句返回,一般块的最后一个表达式的值就是函数的返回值。因此上述函数可修改为下面的形式。
技术分享
  同变量声明不需要显示指定类型相同(变量可以推断变量类型),所以函数也可以推断返回类型,因此可以简写成如下所示:
技术分享
  然而,需要注意的是:如果函数使用return返回,那么必须明确指定函数的返回类型;此外如果是递归函数,也需要指定返回类型。下图所示为通过“return”返回的函数,函数定义时没有指定返回类型,编译器报错。
技术分享
  对于函数参数列表为空的,定义时函数名后可以不跟“()”,使用时也可以不跟“()”,如下图所示:
技术分享

数组及元组的使用

  两种数组定义如下图所示,与Java不同的是需要用到Array关键字。同Java中一样,数组长度不可变,数组元素可变。
技术分享
  Scala中数组通过下标对元素访问的方式如下图所示,主要通过2种方式,第一种是通过“arr(i)”这种方式,与Java中不同,Java中主要通过“arr[i]”这种方式访问。这是因为在Scala中,任何操作符都是函数调用的方式进行的。此外还提供了“arr.apply(i)”这种访问方式。
技术分享
  数组赋值和修改可通过下面两种方式进行,第一种适合代码显示赋值和修改,第二种适合程序运行阶段根据条件对特定元素赋值和修改。
技术分享
  对于数组的遍历可通过以下2种方式。其中第一种注意for循环的to也会取到;第二种遍历方式是通过foreach的方式传递匿名函数,如果数组元素需要指定类型,需要用“(item : String)”括号括起来,如果处理代码较复杂,可用“{}”语句块表示。
技术分享
  Scala中元组的定义和元素访问如下所示,定义时直接使用“()”将不同的类型的若干变量或字面值包围起来即可。值得注意的是,对于元组元素通过“._n”的方式进行访问,且n从1开始计数。
技术分享

参考

Scala学习笔记系列
Scala基础之函数
Scala的循环和数组
面向 Java 开发人员的 Scala 指南系列

Scala学习笔记及与Java不同之处总结-从Java开发人员角度


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有