Scala与Java具有很多相似之处,但又有很多不同。这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变。

这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方。以下列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码演示样例及具体阐述见下文。

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

指定Main函数

  在Java中运行程序,仅仅要指定入口的Main函数就可以。一个project中能够有多个Main函数,每一个类内都能够定义Main函数。可是与Java不同的是,Scalaproject中。仅仅有定义在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开发者角度的更多相关文章

  1. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  2. Scala学习笔记之:tuple、array、Map

    [TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...

  3. 【大数据】Scala学习笔记

    第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java  以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...

  4. 机器学习(三)--- scala学习笔记

    Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...

  5. Scala学习笔记 & 一些不错的学习材料 & 函数编程的历史八卦

    参考这篇文章: http://www.ibm.com/developerworks/cn/java/j-lo-funinscala1/ 这也是一个系列 严格意义上的编程范式分为:命令式编程(Imper ...

  6. 【设计模式】学习笔记17:代理模式之保护代理与Java反射

    本文出自   http://blog.csdn.net/shuangde800 本笔记内容: 1. Java动态代理,反射机制 2. 保护代理 3. 应用保护代理实现的约会系统 ----------- ...

  7. Scala学习笔记--特质trait

    http://outofmemory.cn/scala/scala-trait-introduce-and-example 与Java相似之处 Scala类型系统的基础部分是与Java非常相像的.Sc ...

  8. Scala学习笔记——安装

    安装scala,不要使用sudo apt-get install scala来安装 1.从下面网址来下载Scala文件 http://www.scala-lang.org/download/2.11. ...

  9. scala学习笔记3

    一.条件表达式 在scala中if/else表达式有值,这个值就是跟在if或者else之后的表达式的值. scala> val x = 10 x: Int = 10 scala> val ...

随机推荐

  1. Git学习总结(10)——git 常用命令汇总

    1.git 基本概念: 工作区:改动(增删文件和内容) 暂存区:输入命令:git add 改动的文件名,此次改动就放到了'暂存区'(新增的文件) 本地仓库(简称:本地):输入命令:git commit ...

  2. UESTC 1143 数据传输 网络流 最大流 Dinic

    数据传输 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Sta ...

  3. 用了一天的时间,linux下expect实现ssh自己主动登录server记,歧视下网上各种抄来抄去残段子

    由于要对客户方的快30个项目进行特别有顺序的重新启动,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的能够. 没有一段是能够正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自己主 ...

  4. Cocos2d-x 常见宏

    1)NS_CC_BEGIN cocos2d命名空间開始 2) NS_CC_END  cocos2d命名空间结束 3)USING_NS_CC 声明cocos2d命名空间 4)CC_SYNTHESIZE_ ...

  5. bzoj1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...

  6. Authentication in asp.net

    https://docs.microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/an-o ...

  7. springMVC接受对象实体并且对象实体里面又有对象集合方式

    springMVC接受对象实体并且对象实体里面又有对象集合方式: Ajax: function add(){ var orders = [ { orderNo : "H222255" ...

  8. (转载)自定义View——弹性滑动

    滑动是Android开发中非常重要的UI效果,几乎所有应用都包含了滑动效果,而本文将对滑动的使用以及原理进行介绍. 一.scrollTo与ScrollBy View提供了专门的方法用于实现滑动效果,分 ...

  9. 在sql server数据库的一个表中如何查询共有多少字段

    select a.* from sys.columns a,sys.tables bwhere a.object_id = b.object_id and b.name = '要查的表名'

  10. hiho1041 - 树,遍历

    题目链接 给一棵树,给一个序列,问能不能按这个序列遍历这棵树,满足每条边最多经过两次. -------------------------------------------------------- ...