Scala学习笔记及与Java不同之处总结-从Java开发者角度
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学习笔记及与Java不同之处总结-从Java开发者角度的更多相关文章
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- Scala学习笔记之:tuple、array、Map
[TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...
- 【大数据】Scala学习笔记
第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java 以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...
- 机器学习(三)--- scala学习笔记
Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...
- Scala学习笔记 & 一些不错的学习材料 & 函数编程的历史八卦
参考这篇文章: http://www.ibm.com/developerworks/cn/java/j-lo-funinscala1/ 这也是一个系列 严格意义上的编程范式分为:命令式编程(Imper ...
- 【设计模式】学习笔记17:代理模式之保护代理与Java反射
本文出自 http://blog.csdn.net/shuangde800 本笔记内容: 1. Java动态代理,反射机制 2. 保护代理 3. 应用保护代理实现的约会系统 ----------- ...
- Scala学习笔记--特质trait
http://outofmemory.cn/scala/scala-trait-introduce-and-example 与Java相似之处 Scala类型系统的基础部分是与Java非常相像的.Sc ...
- Scala学习笔记——安装
安装scala,不要使用sudo apt-get install scala来安装 1.从下面网址来下载Scala文件 http://www.scala-lang.org/download/2.11. ...
- scala学习笔记3
一.条件表达式 在scala中if/else表达式有值,这个值就是跟在if或者else之后的表达式的值. scala> val x = 10 x: Int = 10 scala> val ...
随机推荐
- 【BZOJ 1266】 [AHOI2006]上学路线route
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 第一问是个最短路. 第二问. 利用第一问floyd算出来的任意两点之间的最短路. 那么枚举每一条边(x,y) 如果w[1][x]+c ...
- js Math常用方法
------------------------ 向上取整,有小数就整数部分加1 Math.ceil(5/2) ------------------------ 四舍五入. Math.round(5/ ...
- echarts 柱状图和饼状图动态获取后台数据
运用echarts来实现图表 1.首先下载echarts包 http://echarts.baidu.com/echarts2/doc/example.html,在这里我下载的是 2.将echart ...
- [AngularJS]Chapter 4 AngularJS程序案例分析
前边讲的都是基础.本章看看他们怎么合作的. 我们要建一个程序.一次一步.章末结束 [这个程序] GutHub是一个简单的菜谱管理程序.功能是存好吃的的菜谱并提供步骤.这个程序包含: 两列布局 左边是导 ...
- python部分
读取骨骼数据相关的多个json,拼接到一起 # -- coding: utf-8 -- import os path = "./test" #文件夹目录 files= os.lis ...
- vs2015汉化
VS2015汉化 VS2015安装打开后默认是英文的,将它改成中文的VS 1.安装下载好的语言包进行安装 2.正在安装 3.安装完成后关闭 4.打开VS2015默认不是中文的,点击Tools--> ...
- Creative Cloud 安装出错,错误代码:207
C:\Users\xxx\AppData\Local\Temp\CreativeCloud\ACC\AdobeDownload %Temp%\CreativeCloud\ACC\AdobeDownlo ...
- FCC编程题之中级算法篇(下)
介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Smallest Common Multiple 2. Finders ...
- json转换成Map
1.如果转换的是Map.或者是简单的对象 package com.gc.action; import java.util.Map; import net.sf.json.JSONObject; /** ...
- How Javascript works (Javascript工作原理) (十) 使用 MutationObserver 监测 DOM 变化
个人总结: 这篇文章介绍了几种监测DOM变化的方法,重点介绍的是一个新浏览器API叫做MutationObserver. 注意:不要和Vue.js种 Object.defineProperty() 的 ...