Scala学习回顾(五)---- scala中的apply

注:本文学习源自:DT大数据梦工厂(微信公众号:DT_Spark)

在Scala中,我们通常都会使用类似函数调用的语法。举例来说,如果s是一个字符串,那么s(i)就是该字符串的第i个字符。(而在java中,你会这样写:s.charAt(i)。)在IDEA中运行如下代码:

println(“Hello(4)”)//将打印出’o’

你可以把这种用法当做是()操作符的重载形式,它背后的实现原理是一个名为apply的方法。举例来说,在StringOps类的文档中,你会发现这样一个方法:

def apply(n : Int) : Char

也就是说,”Hello”(4)是如下语句的简写:

“Hello”.apply(4)

如果你去看BigInt伴生对象的文档,就会看到让你将字符串或数字转换为BigInt对象的apply方法。举例来说,如下调用

BigInt(“1234567890”)

是如下语句的简写:

BigInt.apply(“1234567890”)

这个语句产生出一个新的BigInt对象,不需要使用new。例如:

BigInt(“1234567890”) * BigInt(“1234567890”)

像这样使用伴生对象的apply方法是scala中构建对象的常用方法。例如,Array(1,4,3,4)返回一个数组,用的就是Array伴生对象的apply方法。

下面我来做一个练习:

运行结果:

再看一个练习:

1、新建一个类:

2、额外提一点,放在object对象中的方法都是静态方法,如下所示:

运行结果:

3、接下来看一下apply方法的使用:

运行结果:

上面代码当中,我们使用“val a = ApplyTest1()”的使用会导致apply方法的调用并返回该方法调用的值,也就是ApplyTest的实例化对象。

Class中也可以由apply方法,其使用方法如下所示:

运行结果:

由于object中的方法和属性都是静态的,所以就是单例对象的理想载体,实例代码如下所示:

换句话说,object本身就是一个单例对象。

参考资料:

DT大数据梦工厂微信公众号:DT_Spark

时间: 2024-10-01 04:35:26

Scala学习回顾(五)---- scala中的apply的相关文章

Spark基础-scala学习(五、集合)

集合 scala的集合体系结构 List LinkedList Set 集合的函数式编程 函数式编程综合案例:统计多个文本内的单词总数 scala的集合体系结构 scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trait.这个结构与java的集合体系非常相似 scala中的集合是分成可变和不可变两类集合的,其中可变集合就是说,集合的元素可以动态修改,而不可变集合的元素在初始化之后,就无法修改了.分别对应scala.collec

[原创]Scala学习:编写Scala脚本

scala支持脚本 1)在/opt/scala-script下创建一个文件hello.scala 编辑内容如下: $ hello ,this is the first scala script 2)运行脚本 scala脚本的命令行参数保存在名为args的scala数组中.scala里,数组以0开始,可以通过在括号里指定索引值来访问数组元素.scala里数组 args 的第一个元素是:args(0),而不是像Java那样的:args[0].现在,把以下内容写到新文件: HelloWithArgs.

【Scala学习之一】 Scala基础语法

环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark-1.6 Scala是一种混合功能编程语言,类似java,运行于JVM,集成面向对象编程和函数式编程的各种特性.(1)Scala可以与Java互操作:它用scalac这个编译器把源文件编译成Java的class文件,从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的

scala学习手记16 – scala中的static

前面两节学了scala的对象和伴生对象,这两个在使用的时候很有些java的静态成员的意思. scala中没有静态字段和静态方法.静态成员会破坏scala所支持的完整的面向对象模型.不过可以通过伴生对象实现对scala的类一级的操作. 回过头来再看一遍那个Marker的例子,略做了一些调整: class Marker private(val color: String) { println("Creating " + this) override def toString(): Stri

Scala学习回顾(二)---- scala函数定义、流程控制及异常处理

注:本文学习源自:DT大数据梦工厂(微信公众号:DT_Spark) 1.上一节中我们了解到scala hello world,具体定义一个函数如下: 2.定义一个没有参数的函数,如下: 运行结果: 3.定义一个有参数的函数,如下: 4.流程控制 如果运行的时候,输入了参数,则情况如下: 方式二: 也可以将函数直接放入输出语句中: 如下: println(if (!args.isEmpty) args(0) else "scala.txt") 5.for循环 方式1: 方式2:(列出当前

scala学习手记2 - scala中的循环

先来看一段Java中的循环: for (int i = 1; i < 4; i++) { System.out.print(i + ","); } 毫无疑问,scala可以让这个循环更加简洁.根据上一节中的内容,没有必要显示指定变量i的类型,我们甚至不需要声明这个变量.其次输出的语句也可以更加简洁一些,在scala中可以直接使用println()这个方法输出字符串.最后scala的循环结构也是非常的轻量级.好了,可以看一下代码了: for (i <- 1 to 3) { p

Scala学习回顾(一)---- scala的环境搭建

注:本文学习源自:DT大数据梦工厂(微信公众号:DT_Spark) 1.先下载scala安装包: 为后续spark的学习,咱们需要选择版本:2.10.4 http://www.scala-lang.org/download/2.10.4.html 2.安装完后,选择scala IDE,一个是Eclipse scala IDE,另一个是Intellij IDEA 因个人偏爱于Intellij IDEA,故以Intellij IDEA为例. 3.IDEA的使用 ①新建Model ②选择scala ③

Scala学习回顾(四)---- For与Function进阶实战、Lazy的使用

注:本文学习源自:DT大数据梦工厂(微信公众号:DT_Spark) 1.For循环的进阶 2.函数的进阶 3.lazy的作用 参考资料: DT大数据梦工厂微信公众号:DT_Spark

scala 高级十五 scala 高介函数式编程

1.高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数):另外一种是返回值是函数的函数. 2.值函数,我们可以用 var或者val 定义一个参数去接收一个函数叫做值函数 ,格式为 var fun_name=funName _ 上图我们定了一个 add函数有两个参数,返回一个int 类型, 然后用吧定义好的add 函数传值给 fun_add   var fun_add=add _  然后用fun_add(2,7) 去调用函数 3.函数的嵌套 //嵌套函数的使用在函数体再定义一个