变量定义

scala定义两种变量:

  • var 可变 初始化之后,可以多次被重新赋值
  • val 不可变 一旦被初始化 就不能再赋值。
var firstarg :java.lang.String =  "Hello World"
val secondarg :java.lang.String = "Hello dear"

但是由于有简化名的存在可以如下写法

var firstarg :String = "Hello World"

因为 scala 具有类型推断的能力,因此还可以如下写:

var firstarg = "Hello World"

打印输出:

println("Hello World") // 该方法 会自动换行
print("Hello World") // 该方法 不会 自动换行
print(firstarg)
函数定义
def fun(x: Int, y: Int):Int = {
return x + y // 其实这么写是不好的,为什么不好,以后再说
}
/*
def 开始函数的定义
fun 函数名
x:Int 参数,必须要指定类型,默认所有的参数都是 val 也就是 不可变的。
fun(*):Int 函数返回的值的类型 返回类型可以省略,scala可以推断,但是在递归函数例外,必须指定
= 连接函数名和函数体,必须要有,如果没有就是另外一种结果了。
{*} 花括号 包含函数体 如果函数体只包含一条语句,那么{}可以不写 另外:scala 采用 /*ssss*/ 和 // ssss 两种注释方式
*/

综合上面两个省略,函数也可以写成如下:

def fun(x:Int, y:Int) = x + y

函数一旦定义号,就可以通过函数用调用了

fun(1,2)
数组 (Array)

scala 使用 new 方法实例化对象(也叫类实例) ,在实例类的过程中,可以传入值和类型使实例参数化

参数化 指:创建实例的同时完成对它的设置。

  • 使用值 参数化实例,可以把值传给构造器的 括号来实现。
  • 使用类型 参数化实例, 可以把一个或多个类型指定到基础类型后的 括号来实现
val big = new java.math.BigInteger("12345")
val gre = new Array[String](3) //实例化了一个字符串数组,其初始长度为 3
gre(0) = "hello"
gre(1) = "xiao"
gre(2) = "ming"
gre.foreach(println) //查看 gre 的三个元素
val gree: Array[String] = new Array[String](2) //这么写当然也是可以的
//以上二者都不是初始化数组的推荐方式

访问数组内的元素

print(gre(0)) // "hello"

val 说明 gre 是不可变的,但是 gre 内部的元素是 可变的。

gre(0) = "welcom"
print(gre(0)) // "welcom"
gre = Array[String](5) // 会报错 因为它是 val 类型的。

scala 没有传统意义上的操作符,也就没有操作符重载。因为 + - * / 这样的字符,是方法名。

我们1 + 2 实际上是调用了 1+ 方法,然后把2 作为参数传给 + 方法。详细些如下:

1 + 2  // 我们这样写
1.+(2) //实际上是如此

也可以解释为什么scala 方位数组内元素用 小括号 而不是 方括号

gre(0) // 我们这样写
gre.apply(0) // 实际上是如此 调用了 apply 方法
gre(0) = "nihao" //我们这样写
gre.update(0,"nihao") // 实际上是这样 调用了update 方法

scala 有这样一个原则

任何对于对象的值参数应用将都被转化为对 apply 方法的调用

更简洁的初始化数组方法:

val numArr = Array("one","two","three")
//该方法创造并返回了新数组的 apply 方法

方法没有副作用是函数式编程的重要理念,计算并返回值应该是方法的唯一目的

所谓 副作用 我的理解是在函数运行中与返回值无关的,只是为了达到某些目的而进行的一些运算。如:

def fun(x:Int):Unit ={ //Unit 表示不返回任何值。
x+1 // 这个函数我们不需要返回任何值,只是为了达到将x 加 1的目的,其实把这个方法放到类里面举例更好,这是副作用
print(x) // 这也是副作用
}
列表

数组和列表都是同类对象序列。不同的是:数组是可变的。而列表可变

对列表的修改,其实是生成了一个新的列表

val a = Array("hello","ni","hao")
val b = List("hello","ni","hao")
a(0) = "welcom" // print(a(0)) 为 “welcom”
b(0) = "welcom" //会报错
b = List("haha") //这样也不可以

scala-学习 1的更多相关文章

  1. Scala学习资源

    Scala学习资源: Scala官方网站:http://www.scala-lang.org/ Scala github:https://github.com/scala/scala Twitter ...

  2. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

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

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

  4. 【Scala】Scala学习资料

    Scala学习资料 java 树形 分类器_百度搜索 决策树分类器-Java实现 - CSDN博客 KNN分类器-Java实现 - CSDN博客 学习:java设计模式—分类 - 飞翔荷兰人 - 博客 ...

  5. Scala学习网址

    scala学习网址为:https://twitter.github.io/scala_school/zh_cn https://www.zhihu.com/question/26707124

  6. Spark之Scala学习

    1. Scala集合学习: http://blog.csdn.net/lyrebing/article/details/20362227 2. scala实现kmeans算法 http://www.t ...

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

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

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

    Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...

  9. Scala学习(一)

    最近在学习Scala,总结了一下比较基础的知识. 一.Scala简介 1.Scalable Language,是一门多范式的编程语言,是一种纯面向对象的语言,每个值都是对象. 2.特点:①Scalab ...

  10. scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

    一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...

随机推荐

  1. bzoj 4772 显而易见的数论——拆分数(五边形数定理)+线性筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4772 题解:https://blog.csdn.net/Dream_Lolita/artic ...

  2. golang cannot assign to

    问题: # command-line-arguments .\example.go:22: cannot assign to m.V.(BasicMessage).Length 想在函数中修改inte ...

  3. opencv中的缩放函数

    图像处理里面缩放操作是比较常见的: 最近邻插值:类似简单映射的处理方式,目标图像w1,h1,原始图像w0,h0,则在目标图像上的点(x,y)的像素点实际对应原始图上(x*w0/w1,y*h0/h1)的 ...

  4. 从c#数组求和说起

    c#是一种玩具语言 为什么这么说, 举个简单的例子,提问:对数组[1,2,3]求和有几种方法? 我能说出来的,四种.说出来,不是上网查出来. for,foreach,sum,while. for好像大 ...

  5. CSS Grid布局入门

    相信大家都比较熟悉flex布局了,最近有空研究了波grid布局,感觉虽然兼容性还不是太高,应用不是太普遍,但是功能非常强大.未来应该是grid+flex为主流,grid是二维布局,很灵活,适合整体构架 ...

  6. maven学习(3)-Maven 核心技术

    第一节:Maven 仓库概念 Maven 远程仓库配置文件: $M2_HOME/lib/maven-model-builder-3.3.3.jar 文件:org\apache\maven\model\ ...

  7. 显式等待大结局___封装成API方便控制层调用

    控制层 测试用例层: 控制层示例代码: #coding=utf-8from selenium.webdriver.common.by import Byfrom selenium.webdriver. ...

  8. Logstash之三:命令行中常用的命令

    -f:通过这个命令可以指定Logstash的配置文件,根据配置文件配置logstash -e:后面跟着字符串,该字符串可以被当做logstash的配置(如果是“” 则默认使用stdin作为输入,std ...

  9. 利用.pbk来实现ADSL开机自动拨号

    当你新建拨号连接或者VPN连接之后在你的电脑里会创建一个.pbk的文件 这个.pbk的文件可以说是一个集合,将你电脑的所有连接都保存在一起. 同时你还可以将此连接复制起来传给其他人. 系统默认的.pb ...

  10. Windows10右键添加“在此处打开命令窗口"

    今天跑代码时用到了Powershell,有一个环境变量死活都找不到,无奈只好重新回到cmd命令行测试,结果立马就跑通了.-_-||  由于现在Win10默认右键只有Powershell,所以为了以后方 ...