spark开发基础之Scala详解apply方法

问题导读 1.什么情况下调用apply方法? 2.apply你认为有哪些作用? 3.方法调用属于apply什么功能? apply网上很多资料,但是总感觉总讲的不是很透彻。这里自己总结下:包括摘录及个人经验,希望可以加深大家的理解 什么情况下会调用apply方法 当遇到下面表达式时,apply方法会被调用:Object(参数1,参数2。。。。参数N) 通常这样一个方法返回的是伴生对象。 举例来说:Array对象定义了apply,我们可以用下面形式来数组 Array("about”,"yun","com") 为什么不使用构造器?对于嵌套式表达式而言,省去new关键字方便很多,例如 Array(Array("about","yun"),Array("www","com")) 我们比较容易搞混 Array("about","yun")与new Array("about","yun") 表面是多了一个new,他们的原理是不同的。 第一个调用的apply方法 第二个调用的this构造器 理解apply方法:实例化作用 这里一个定义apply方法的示例 class Account private (val id: Int, initaBalance: Double){ private var balance = initaBalance } Object Account//伴生对象 { def apply( initaBalance: Double)=new Account (newUniqueNumber(),initalBalance) } 这样就可以通过apply创建对象了。 val acct=Account (1000.0) 我们在来看一个例子 package aboutyun.com class ApplyTest{ def apply()=println("I want to speak good english !") def haveATry: Unit ={ println("Have a try on apply") } } object ApplyTest{ def apply()={ println("I am a student of KMUST") new ApplyTest } } //驱动函数 object ApplyOperation { def main(args:Array[String]): Unit ={ //调用伴生对象的apply方法,实例化 val a=ApplyTest() a.haveATry } }

上面我们可以先忽略类的apply方法,只看伴生对象的apply方法。也就是说伴生对象的apply方法简化了对象的实例,一般对象的实例化是 A a=new A(); 有了apply,我们可以这样 A a=A(); 同样对应起来 val a=new ApplyTest() 有了apply,可以这样 val a=ApplyTest(),其实它是是val a=ApplyTest.apply()的简化。 从这里我们再次得出,只要是我们使用apply实例化的类,必定有伴生对象。 (补充:Scala中同名和类和对象分别称之为伴生类和伴生对象) 为了加深理解,我们在换另外一个说法 半生对象中有一个apply方法 构造类的时候一般不用new A() 上面不知你是否理解,这样我们在反过来,假如一个类,没有伴生对象,能否使用使用A a=A();的方式。 显然这样是不行的。但是在Scala中,很多类默认都是由伴生对象的,所以我们可以简化类的实例。这样apply方法你是否理解了。

对象调用apply方法

apply除了实例化作用,我们看到实例化的对象,还可以a();这样,这时候调用的是类的apply方法,而非伴生对象的。
package aboutyun.com

class ApplyTest{
  def apply()=println("I want to speak good english !")

  def haveATry: Unit ={
    println("Have a try on apply")
  }
}
object ApplyTest{
  def apply()={
    println("I am a student of KMUST")
    new ApplyTest
  }
}
//驱动函数
object ApplyOperation {
  def main(args:Array[String]): Unit ={
//调用伴生对象的apply方法,实例化
    val a=ApplyTest()
    a.haveATry
    a();
  }
}





##############################

通过上面我们的理解,我们来看下下面的内容:

[Scala] 纯文本查看 复制代码

?

scala> val f = (x: Int) => x + 1
f: Int => Int = <function1>

改如何调用函数对象的方法

[Scala] 纯文本查看 复制代码

?

scala> f.apply(3)

上面为何能这么做,这是因为函数也是对象,, 每一个对象都是scala.FunctionN(1-22)的实例。每次调用方法对象都要通过FunctionN.apply(x, y...), 就会略显啰嗦, Scala提供一种模仿函数调用的格式来调用函数对象

[Scala] 纯文本查看 复制代码

?

scala> f(3)
res3: Int = 4

上面其实就是scala.FunctionN的对象。f(3),就是 f.apply(3) ######################## apply方法具有查找属性 集合类 在Scala集合一文中提到过Iterator迭代器的几个子trait包括Seq, Set, Map都继承PartialFunction并实现了apply方法, 不同的是实现的方式不一样, 也就是说如果前面是集合,后面使用apply,则具有查找功能

[Scala] 纯文本查看 复制代码

?

scala> Seq(1, 2, 3).apply(1) // 检索
res6: Int = 2
  
scala> Set(1, 2, 3).apply(2) // 判断是否存在
res7: Boolean = true
  
scala> Map("china" -> "beijing", "US" -> "Washington").apply("US") // 根据键查找值
res8: String = Washington
  
scala> Set(1, 2, 3)(2)
res9: Boolean = true
  
scala> Set(1, 2, 3)(2)
res10: Boolean = true
  
scala> Map("china" -> "beijing", "US" -> "Washington")("US")
res11: String = Washington

总结: 从上面总结: apply方法具有三个作用 1.具有实例化的作用 2.实例化对象可以再次调用apply方法 3.apply在集合中具有查找作用

本文分享自微信公众号 - about云(wwwaboutyuncom)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-11-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和PYTHON有个约会

19. 再说函数~那些不得不知道的事儿

前面的课程中,我们已经对函数有了简单的了解 函数的声明、函数的的调用、函数的参数以及返回值等等

8430
来自专栏夏时

PHP 特色:可变变量

15340
来自专栏java学习

第3天的练习

大家把答案在留言区留下来 1:常见的算术运算符有哪些? +运算符的作用有哪些? 除法和取余的区别? ++和--的使用规则? 2:常见的赋值运算符有哪...

37270
来自专栏算法与数据结构

n! 进制

n! 进制 Time limit per test: 1.0 seconds Time limit all tests: 1.0 seconds Memory ...

32890
来自专栏好好学java的技术栈

“面试不败计划”: java语言基础面试题(二)

10920
来自专栏一“技”之长

JavaScript基础之二——方法与属性 原

    和编译型语言必须由类产生对象不同,JavaScript语言中并没有严格的类的界定,并且对象的属性和方法也可以进行动态的绑定。属性是对象中封装的一些值数据...

7420
来自专栏机器学习算法与Python学习

Python:爬虫系列笔记(6) -- 正则化表达(推荐)

在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了...

37580
来自专栏Java技术栈

JDK8新特性之方法引用

什么是方法引用 方法引用是只需要使用方法的名字,而具体调用交给函数式接口,需要和Lambda表达式配合使用。 如: List<String> list = Ar...

29850
来自专栏小樱的经验随笔

析构函数的用法【简单理论讲解】

析构函数是“反向”的构造函数。它们在对象被撤消(回收)时调用。析构函数的名 称除了最前面的“~”符号外,与类的名称相同。例如,类String的析构函数是~str...

301110
来自专栏JetpropelledSnake

Python学习笔记之Python正则表达式指南

正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分...

22010

扫码关注云+社区

领取腾讯云代金券