Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Scala:如何使用默认值初始化对象

Scala:如何使用默认值初始化对象
EN

Stack Overflow用户
提问于 2012-05-06 17:44:31
回答 2查看 26.8K关注 0票数 14

我认为用一个例子来解释这一点会更好。

我有以下案例类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
case class Person(name: String = "no name", surname: String = "no surname")

并且我想创建一个通用函数来填充它,例如,json消息,它可能不指定所有字段。

我知道,要使用默认值,简单的答案是不将它们传递给构造函数,但是如果我有几个字段可能出现在json中,也可能没有出现在json中,我应该使用一个巨大的switch语句来涵盖所有可能的缺少参数的组合。在这种情况下,在读完json之后,我应该注意名字和姓氏的存在,没有名字,没有姓氏,没有名字也没有姓氏大小写…(天哪,我希望我说得很清楚)。

更准确地说,我正在尝试开发一个函数,该函数允许我从以下json值创建一个person,在缺少某些参数时使用默认值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ "name": "john", "surname": "doe" }
{ "surname": "doe" }
{ "name": "john" }
{ }

这就是为什么我在寻找一种更通用的方法来处理这个问题。

(我将展示一些伪代码,以及我试图实现的想法)

我在想像这样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val p = Person(name= "new person name", surname= Unit)

在这种情况下,surname应该获取默认值

或者类似于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val p = Person( Map( "name" -> "new person name" ) _* )

因此,它还接受surname的默认值

或者在构造函数中这样做,如果我检测到一个空值(或无),我可以赋值为默认值。

实际上,我正在尝试避免重复默认值的定义。

无论如何,实现这一目标最常用的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-06 17:47:05

如果您希望使用默认值,通常只需省略该命名参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scala> val p = Person(name = "new person name")
p: Person = Person(new person name,no surname)

但是,由于您希望显式地知道某个值是否应为默认值,因此可以在构造函数中实现基于Map的想法。如果你不想重复默认设置,下面这两个选项如何:

选项1:默认值的外部化常量

在外部设置默认值。在主构造函数和基于Map的构造函数中都使用它们。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val nameDefault = "no name"
val surnameDefault = "no surname"

case class Person(name: String = nameDefault, surname: String = surnameDefault) {
  def this(m: Map[String, String]) =
    this(m.getOrElse("name", nameDefault), m.getOrElse("surname", surnameDefault))
}

用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Person(name = "new person name", surname = "new person surname")
new Person(Map("name" -> "new person name"))
new Person(name = "new person name")

选项2:可选的备用构造函数

你可能会发现它更简洁一些,因为它不依赖于外部化的常量。这里唯一的缺点是,如果您只想使用一些参数进行构造,则必须将每个参数都包装在Some()中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
case class Person(name: String, surname: String) {
  def this(name: Option[String] = None, surname: Option[String] = None) =
    this(name.getOrElse("no name"), surname.getOrElse("no surname"))

  def this(m: Map[String, String]) = this(m.get("name"), m.get("surname"))
}

用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Person(name = "new person name", surname = "new person surname")
new Person(Map("name" -> "new person name"))
new Person(name = Some("new person name"))
new Person(name = "new person name") // can't do this
票数 23
EN

Stack Overflow用户

发布于 2012-05-06 18:58:40

我认为这对任何一个都可能是一个有用的案例。您可以指定具有两种类型的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val name: Eiter[String, Unit] = Left("name")
val surname: Either[String, Unit] = Right( () )

现在,您可以检查是否拥有Left或Right,并使用所需的参数调用构造函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10472758

复制
相关文章
Scala对象
如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类
羊羽shine
2019/07/31
2850
Scala教程之:面向对象的scala
我们知道Scala是一种JVM语言,可以合java无缝衔接,这也就大大的扩展了scala的应用范围,大数据里面有名的spark就是使用scala编写的,那么scala到底有什么奥秘和特性呢?我们一一来揭秘。
程序那些事
2020/07/07
5690
Scala Json对象转Map对象[通俗易懂]
文章来源:https://blog.csdn.net/qq_37267676/article/details/116668384
全栈程序员站长
2022/09/23
2.1K0
scala(八) 面向对象
当然也可以成修饰符private Scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)
用户1483438
2022/04/14
3400
Scala入门与进阶(四)- Scala面向对象
Scala面向对象 1.面向对象概述 封装:属性方法封装到类中 继承:父类和子类直接的关系 多态:***** 父类引用指向子类对象 精髓所在,开发框架的基石 2.类的定义和使用 package com.gwf.scala.course04 object SimpleObjectApp { def main(args: Array[String]): Unit = { val person = new People() person.name = "Messi" println(person.name
Meet相识
2018/09/12
4770
Scala里面如何使用枚举
枚举通常用来定义已知数量的常量,比如月份,星期,季节等等,用过java的人都知道定义枚举的关键字是enum,在scala里面和java有所不同,来看一个完整的例子定义: 上面的这个例子基本涵盖了枚举的所有常用方法,定义枚举我们继承的是Enumeration抽象类,然后通过内部对象Value来赋值每一个枚举的值,此外里面还定义了几个工具方法,比如判断是否存在某个枚举,是否是工作日,以及打印所有的枚举值,在使用的时候可以直接通过Object来访问 。 此外还可以用枚举值做模式匹配: 上面基本就是Scala里面最
我是攻城师
2018/05/14
1.1K0
如何使用Scala的exists函数
在本文中,我们将演示如何在Scala的集合上使用exists函数,该函数适用于Scala的可变(Mutable)和不可变(Immutable)集合。
九州暮云
2019/08/21
2K0
Spark学习使用笔记 - Scala篇(3)- 对象
field class Counter { //field必须初始化,为了知道类型 //会自动生成private的getter还有private的setter //setter和getter并不是getValue()和setValue()这样,而是value(),value_=()这样 private var value = 0 def increment() = { value += 1 } def current() = value //类私有field可以
干货满满张哈希
2021/04/12
3150
【说站】python参数默认值如何使用
1、参数默认值,即为参数设置默认值,然后在调用函数时不会输入该参数,Python会自动用默认值填充参数。
很酷的站长
2022/11/24
1.5K0
【说站】python参数默认值如何使用
Scala学习二-面向对象
适用于var变量,对于val不适用,注意如果使用下划线进行初始化,此时必须提供数据类型,这样就可以进行自动推断赋初始值
路行的亚洲
2020/10/26
8930
Python 函数中使用默认值参数 — 谈谈可变对象的坑?!
在 python 中定义函数,其参数可以使用多种不同的方式,其中包括 “默认值参数”类型,那么当作默认值的对象有什么限制和要求么?这里搞不好还真有坑! 接下来我们主要从两个角度来谈谈。
用户7886150
2021/01/16
1.6K0
Scala学习三-面向对象
前面我们已经学习了特质类似接口,其可以被继承,同时如果需要继承多个特质的话,则需要使用extends…with…进行继承。其类似java中的接口和抽象方法的结合体,但又比java中的其要强大,因为其可以定义抽象字段和普通字段、抽象方法和普通方法。而在java中接口中可以定义常量,不能定义变量。同时特质还可以继承class类,而在java中接口通常是用来实现的。
路行的亚洲
2020/10/26
6970
Scala学习三-面向对象
Scala 【 6 面向对象编程 】
定义不带 private 的 var field,此时 scala 生成的面向 JVM 的类时,会定义为 private 的 name 字段,并提供 public 的 getter 和 setter 方法。
Lokinli
2023/03/09
2320
Scala入门之面向对象
scala> type S = String defined type alias S
算法之名
2019/08/20
3190
在Scala里面如何使用元组
元组在Scala语言中是一种十分重要的数据结构,类似数据库里面的一行记录(row),它可以将不同类型的值组合成一个对象,在实际应用中十分广泛。 先来看一个简单的tuple定义: 上面的第二种例子中,可
我是攻城师
2018/05/14
8130
Spark学习使用笔记 - Scala篇(4)- 对象、包
单例: object singleton { /** * 利用单例object: * 作为存放工具函数或者常量 * 高效共享单个不可变实例 * 单例模式协调 */ object ID { private var lastNumber = 0; def newUniqueId = { lastNumber += 1 lastNumber } } } 伴生 object associate { /**
干货满满张哈希
2021/04/12
3830
如何使用scala+spark读写hbase?
最近工作有点忙,所以文章更新频率低了点,希望大家可以谅解,好了,言归正传,下面进入今天的主题: 如何使用scala+spark读写Hbase 软件版本如下: scala2.11.8 spark2.1.0 hbase1.2.0 公司有一些实时数据处理的项目,存储用的是hbase,提供实时的检索,当然hbase里面存储的数据模型都是简单的,复杂的多维检索的结果是在es里面存储的,公司也正在引入Kylin作为OLAP的数据分析引擎,这块后续有空在研究下。 接着上面说的,hbase存储着一些实时的数据,前两周新需求
我是攻城师
2018/05/14
1.7K0
Scala-12.对象(object)
object在Scala中是一个关键词,同时对象也是一个概念,即类的一个实例 asInstanceOf方法可以将一个实例强制转换为另一个期望的类型。 用scala的classOf方法来代替Java的.class。可以得到对象所属的类 创建启动入口有两种方式,其实两种方法都是从object启动而不是class: 继承App特质的object: 该特质使用DelayedInit功能实现,也就是object的字段在main方法执行前都没有被初始化 一般不需要覆盖main方法:其目的是将整个类编程main方
悠扬前奏
2019/07/15
6240
Scala使用
Scala是一门主要以Java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程语言的最佳特性综合在一起的编程语言。你可以使用Scala编写出更加精简的程序,同时充分利用并发的威力。由于Scala默认运行于JVM之上,因此 它可以访问任何Java类库并且与Java框架进行互操作,比如Scala可以被编译成JavaScript代码,让我们更便捷、高效地开发Web应用。
俺也想起舞
2019/07/24
6140
解决scala对象转化为json对象为{}
在使用scala中的样例类时,如果要将对象转化为json字符串,需要在每一个属性前面加一个@BeanProperty,这样才能正常输出:
gzq大数据
2021/03/20
2.1K6

相似问题

Scala对象初始化

50

如何在Scala中使用默认值初始化泛型数组

22

Scala对象初始化错误

12

使用scala进行不同风格的对象初始化

10

Scala对象的初始化是如何工作的?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文