Scala中的apply方法

2023-11-09

 

1.apply的场景

Scala中实例化一个类,可以不用new , 其原因 其实就是 apply 方法,具体原因 后边再讲:

 

 

在上句中Scala 生成Array对象, 会自动去调用 Array 这个伴生对象 伴生类中的apply方法, 

Scala中apply方法 最大的特点就是 当一个实例化的类对象后边跟小括号(),并在小括号中传递了参数,  那么Scala会自动去该 类中找apply方法执行,ps:这个apply方法的参数要与 实例化对象后边小括号内的参数一致

eg:

class ApplyTest {
  def apply(name:String): Unit ={
    printf("called apply method , and name is %s",name)
  }
}
val test = new ApplyTest
test("张三") //会自动调用 apply方法

输出:

 

2.然后看下apply方法的调用约定:

 

即 如果我们让一个类的实例化对象  或者一个单例对象,后边直接跟一个小括号并在括号中传递参数, eg:  类实例(参数) 或  单例对象(参数)   , 

 这种写法出现时,Scala会自动在该对象中 查找apply 方法,而且这个apply方法的参数和 调用时候写的 参数一致 (即:参数个数和类型一致)

 

eg:

 

class ApplyTest {
  def apply(name:String): Unit ={
    printf("called apply method , and name is %s",name)
  }
}
val test = new ApplyTest
test.apply("张三")

 

输出:

 

3.apply 可以用来干嘛

最主要的是 结合伴生对象,利用伴生对象 是object单例静态对象 不用实例化,来构建工厂模式,创建实例化对象。即实现: "  val 实例对象 =  类名(参数)  "    这种函数式编程的风格实现 实例化对象,

可以不用Java面向对象式的  " 类名 实例名 = new 类名() ", 这就体现了Scala的  面向对象和 函数编程 的融合

 

 

伴生对象,其实就是一个与实体类名称相同的 object 单例对象

伴生对象 详细说明:https://blog.csdn.net/hzp666/article/details/115863497

 

 

4.Scala中使用apply方法  实现函数式编程方式  实例化对象

 

 

eg1:

class ApplyTest(name:String){
  def speak(){
    val name = this.name
    println(name+"is speaking")
  }


}
object ApplyTest{
  def apply(name:String): ApplyTest ={
    new ApplyTest(name)
  }

}
val p1 = ApplyTest("张三")
p1.speak()

 

输出:

 

eg2:

 

5.Scala融合了面向对象 和 函数式编程

eg:

def add = (x:Int, y:Int) => x+y

println("这里没有调用apply", add(1,2))
println("这里调用 apply:",add.apply(2,3))

输出:

 

不需要去写apply方法, 系统会自动支持apply写法

ps: 但是 在实例化类 中 有两种方法,1. 要么在伴生对象中 定义好apply方法  2. 在class 前加 case ,这样系统会自动生成 apply方法

eg1:  还是自定义 apply

 

eg2: 使用case  让系统自动生成apply

case class Dog(val name:String){
  def bark(): Unit ={
    println("dog is wangwang")
  }
}

val daHuang = Dog("daHuang")
daHuang.bark()

 

输出:

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala中的apply方法 的相关文章

  • Scala:在运行时获取 mixin 接口

    我需要在运行时从给定的类获取所有接口 全部加载在类加载器中 例如 如果一个类是这样声明的 trait B trait C trait D class A extends B with C with D 我想在运行时获取这些信息 A 取决于
  • 自定义 NIO 文件系统无法通过 SBT 的测试任务加载

    为了进行测试 我使用内存中的 NIOFileSystem执行 memoryfs https github com openCage memoryfs 我以前已经利用过它 并且它似乎运行良好 例如梅文 然而 现在 在SBT项目中 不可能初始化
  • 新式(“内联”)宏需要 scala.meta

    我刚刚更新到 scala meta 2 0 0 M1 和最新的 scala 2 12 3 现在宏不再编译 我所做的唯一更改是将元版本从 1 8 0 更改为 2 0 0 M1 错误 新式 内联 宏需要 scala meta 有谁知道是否有快速
  • 使用原始类型模拟案例类

    考虑以下类型结构 trait HasId T def id T case class Entity id Long extends HasId Long 比方说 我们想在一些测试中模拟实体类 val entityMock mock Enti
  • 使用 Akka 玩 2.5 - 找不到参数超时的隐式值:akka.util.Timeout

    我正在尝试使用 Play 2 5 测试 Akka 但遇到了一个似乎无法解决的编译错误 我正在关注 Play 文档中的此页面 https playframework com documentation 2 5 x ScalaAkka http
  • 如何发现 Scala 远程 Actor 已死亡?

    在 Scala 中 当另一个 远程 actor 终止时 可以通过设置 trapExit 标志并以第二个 actor 作为参数调用 link 方法来通知一个 actor 在这种情况下 当远程参与者通过调用 exit 结束其工作时 第一个参与者
  • 阶乘的 Scala 排列

    我怎样才能找到n Scala 中某些字母的排列 Scala 2 9 RC1 scala gt abc permutations toList res58 List String List abc acb bac bca cab cba
  • 在 Scala 和 SBT 中调试较长的编译时间

    在我的 Scala SBT 项目中 我有一个文件需要 5 分钟才能编译 所有其他的都可以在几秒钟内编译 这使得开发非常痛苦 我确信我滥用了一些 Scala 构造 但我不知道如何调试它 如何在 Scala 中调试较长的编译时间 我正在使用 S
  • 为什么《Scala 中的函数式编程》一书的“无异常处理错误”一章中没有提到“scala.util.Try”?

    在 Scala 中的函数式编程 一书中的 无异常处理错误 一章中 作者给出 从函数体抛出异常的问题 Use Option如果我们不关心实际的异常 Use Either如果我们关心实际的异常 But scala util Try没有提到 从我
  • Play Framework 2.3 (Scala) 中的自定义 JSON 验证约束

    我设法使用自定义约束实现表单验证 但现在我想对 JSON 数据执行相同的操作 如何将自定义验证规则应用于 JSON 解析器 示例 客户端的 POST 请求包含用户名 username 我不仅要确保该参数是非空文本 而且还要确保该用户确实存在
  • Scala:如何在超类上实现克隆方法,并在子类中使用它?

    我可能会以错误的方式处理这个问题 但我想要一个像这样的对象 class MyDataStructure def myClone val clone new MyDataStructure do stuff to make clone the
  • Scala Tuple2Zipped 与 IterableLike zip

    两种实现有什么区别 这个比那个好吗 有一篇博客文章说 Tuple2Zipped 性能更好 但没有提供原因 并且查看源代码我没有看到差异 val l1 List 1 2 3 val l2 List 5 6 7 val v1 l1 zip l2
  • 使用spark phoenix从表中读取rdd分区号为1

    当我运行我的火花代码时 val sqlContext spark sqlContext val noact table primaryDataProcessor getTableData sqlContext zookeeper table
  • 对 Scala Not Null 特征的库支持

    Notice 从 Scala 2 11 开始 NotNull已弃用 据我了解 如果您希望引用类型不可为空 则必须混合魔法NotNull特征 编译器会自动阻止你输入null 可以值在里面 看到这个邮件列表线程 http www nabble
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • 为什么在 Scala 中函数类型需要以单独的参数组传递到函数中

    我是 scala 新手 我用两种方式编写了相同的代码 但我对两种方式有点困惑 在第二种方式中 f 的参数类型是自动派生的 但在 type1 中 scala 编译器无法执行相同的操作 我只是想了解这背后的想法是什么 Type1 给出编译错误
  • 向 Scala Swing Panel 添加标签时出现类型不匹配错误

    我有这个课程扩展FlowPanel我正在尝试向其中添加标签 import java awt Label Color import scala swing import scala util Random class MyPanel exte
  • 在 Scala 中调用 WebSocket 中的方法

    我是 scala Play 框架和 Akka 的新手 我的函数定义为 def socket WebSocket accept String String request gt ActorFlow actorRef out gt MyWebS
  • 如何访问 Scala XML 中的父元素

    The scala xml包表示带有标记树节点的 XML 但是这棵树在 Scala 2 7 中是单向的吗 因为似乎没有办法访问Elem给定的父级Elem 这似乎同样适用于父母Document 例如 在 XOM 中你有getParent an
  • 按字符分割字符串

    scala 有一个标准的分割字符串的方法StringOps split 但它的行为有点让我惊讶 演示一下 使用快捷便利功能 def sp str String str split toList 以下表达式全部计算结果为 true sp Li

随机推荐

  • Java培训班学费一般多少?Java自学成功率是多少?

    Java培训班学费一般多少呢 Java自学成功率是多少 很多想学Java的新手对培训学费很是好奇 同时也想知道自学成功率 毕竟能不花钱就能学好的话 没必要花巨款学习 关于Java培训费用与自学成功率的答案请往下看 Java培训班学费一般多少
  • 鼠标移入背景图片放大(还原)

  • maven 配置 Tomcat7 插件和启动

    如果想使用 在 maven中使用 Tomcat7 来启动的话 可以这样配置
  • ORBSLAM2计算描述子距离——C++ 位操作得到二进制32位int值中有多少个1

    看ORBSLAM2时算描述子之间的距离时看到的神奇的位操作 特此记录一哈 unsigned int v pa pb v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 d
  • 如何解析EML(邮件)格式的文件以及一款小巧的EML邮件阅读工具

    在理解EML格式的时候 先回顾一下历史 这样有助于理解邮件的格式 比如邮件传输时为何会有多种编码方式 此外 理解EML格式也有助于理解HTTP协议 历史溯源 由于历史原因 我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式 也
  • 用java写一个权限系统的框架

    Java是一种强大的编程语言 可以用来构建复杂的软件系统 包括权限系统 下面是一个简单的Java权限系统的框架 定义用户和角色 首先需要定义用户和角色 比如管理员 普通用户等 分配权限 为每个角色分配不同的权限 比如管理员有所有权限 普通用
  • 58,滴滴,京东等大厂都在用的抓包工具:Fiddler。软件测试工程师必会技能

    前言 Fiddler是一个http协议调试代理工具 它能够记录并检查所有你的电脑和互联网之间的http通讯 设置断点 查看所有的 进出 Fiddler的数据 例如cookie html js css等文件 换句话说就是Fiddler可以拦截
  • java jdbc 时间段和日期段查询

    首先先创建1000条随机日期数据 package jdbc import java sql Connection import java sql Date import java sql DriverManager import java
  • 顺序表的操作及实现(C++)

    顺序表的操作是大家在学习数据结构的第一个模块 也是最简单的一个 下列是顺序表的六种基本操作详解 希望能对您有所帮助 1 建立一个顺序表 输入n个元素并输出 define MAXSIZE 100 确定最大值 define OK 1 defin
  • 世界十大美女城市排行榜出炉:荷兰首都居首位

    中新网6月4日电 据俄罗斯媒体报道 在旅游旺季到来之际 世界著名的 游客文摘 杂志日前公布了在男性游客心目中拥有世界最漂亮女性的十大城市排行榜 荷兰的阿姆斯特丹 以色列的特拉维夫和加拿大的蒙特利尔位列三甲 俄罗斯首都莫斯科位列第五 高居十大
  • String类

    一 字符串 C语言中 字符串用字符数组来实现 Java语言中 用类来实现 该类共分为两大类 字符串常量 不可修改的字符串 存放在String类的对象中 字符串变量 可以修改的字符串 存放在StringBuffer类的对象中 二 String
  • Android:玩转Retrofit+OkHttp+Kotlin协程 网络请求架构

    文章目录 引言 实战 1 引入开源库 2 简单封装 3 开始使用 MVP架构模式 MVVM架构模式 看 这里 https blog csdn net sange77 article details 103959389 引言 目前做APP网络
  • ProcessBuilder waitFor 调用外部应用

    小程序项目最初使用ffmpeg转换微信录音文件为wav格式 再交给阿里云asr识别成文字 视频音频转换最常用是ffmpeg 1 ffmpeg i a mp3 b wav 相关文章 小程序实现语音识别转文字 坑路历程 问题变成怎样使用java
  • swagger 的异常错误

    Errors Hide Resolver error Invalid attempt to iterate non iterable instance In order to be iterable non array objects mu
  • 华为OD机试真题B卷 Java 实现【分班】,附详细解题思路

    一 题目描述 幼儿园两个班的小朋友在排队时混在了一起 每位小朋友都知道自己是否与前面一位小朋友是否同班 请你帮忙把同班的小朋友找出来 小朋友的编号为整数 与前一位小朋友同班用Y表示 不同班用N表示 二 输入描述 输入为空格分开的小朋友编号和
  • == 和equals()的区别

    和equals 的区别 和equals的区别 一 回顾 的使用 运算符 1 可以使用在基本数据类型变量和引用数据类型变量中 不同的类型可以比较 2 如果比较的是基本数据类型变量 比较两个变量保存的数据是否相等 不一定类型形同 如果比较的是引
  • js引用其他js文件

    1 在html文件里面引用 js将type设置为module 在js文件中则可以使用import 与export语法 但打开页面需要使用vscode插件 liveServer 或者open in default browser 去打开页面
  • Ostu(大津法)二值化图像简介

    一 前言 Ostu方法又名最大类间差方法 通过统计整个图像的直方图特性来实现全局阈值T的自动选取 其算法步骤为 1 先计算图像的直方图 即将图像所有的像素点按照0 255共256个bin 统计落在每个bin的像素点数量 2 归一化直方图 也
  • java spring cloud 企业工程管理系统源码+二次开发+定制化服务

    鸿鹄工程项目管理系统 Spring Cloud Spring Boot Mybatis Vue ElementUI 前后端分离构建工程项目管理系统 1 项目背景 一 随着公司的快速发展 企业人员和经营规模不断壮大 为了提高工程管理效率 减轻
  • Scala中的apply方法

    1 apply的场景 Scala中实例化一个类 可以不用new 其原因 其实就是 apply 方法 具体原因 后边再讲 在上句中Scala 生成Array对象 会自动去调用 Array 这个伴生对象的 伴生类中的apply方法 Scala中