如何实现Scala的above,beside和toString

接下来一步,我们将在类Element中实现方法above。把一个元素放在另一个上面是指串连这两个元素 的contents值。因此方法above的第一个草案看上去可能是这样的:

def above(that: Element): Element =  
 new ArrayElement(this.contents ++ that.contents)

++操作符串连两个数组。Scala里的数组被表示为Java数组,但是支持更多的方法。特别是,Scala里 的数组继承自类scala.Seq,能够表现象序列这样的结构并包含许多访问和转换序列的方法。本章会解释 某些数组方法,更全面的讨论将在第17章。

实际上,前面展示的代码并不完全足够,因为它不允许你把不同长度的元素堆叠在一起。然而本节为 了让事情保持简单,我们会任由其状态并仅仅把相同长度的元素传递给above。10.14节里,我们会给 above做个改良,这样客户就能用它组合不同长度的元素了。

下一个要实现的方法是beside。把两个元素靠在一起,我们将创造一个新的元素,其中的每一行都来 自于两个元素的相应行的串连。如前所述,为了保持事情简单我们会一开始假设两个元素高度相同。这 产生了方法beside的下列设计:

def beside(that: Element): Element = {
 val contents = new Array[String](this.contents.length)
 for (i < - 0 until this.contents.length)
  contents(i) = this.contents(i) + that.contents(i)
 new ArrayElement(contents)
}

beside方法首先分配了一个新数组,contents,并串连this.contents和that.contents中相应的数组 元素来填充。最终产生了新的ArrayElement包含了新的contents。

尽管beside的这个实现可以工作,但它是指令式风格,马脚露在我们索引数组的循环。这个方法可以 替代缩减成一个表达式:

new ArrayElement(
 for (
  (line1, line2) < - this.contents zip that.contents
) yield line1 + line2
)

这里,this.contents和that.contents两个数组被使用zip操作符转换为一个对子的数组(可以称为 Tupele2)。zip方法从它的两个参数中拣出相应的元素并组织成对子数组。

例如,表达式:

Array(1, 2, 3) zip Array("a", "b")

将生成:

Array((1, "a"), (2, "b"))

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, 方法
, 元素
, element
, contents
两个
scala tostring、scala 实现接口、scala实现wordcount、scala 实现java接口、scala是java实现的吗,以便于您获取更多的相关知识。

时间: 2024-11-05 10:29:53

如何实现Scala的above,beside和toString的相关文章

Spark修炼之道(进阶篇)——Spark入门到精通:第十六节 Spark Streaming与Kafka

作者:周志湖 主要内容 Spark Streaming与Kafka版的WordCount示例(一) Spark Streaming与Kafka版的WordCount示例(二) 1. Spark Streaming与Kafka版本的WordCount示例 (一) 启动kafka集群 root@sparkslave02:/hadoopLearning/kafka_2.10-0.8.2.1# bin/kafka-server-start.sh config/server.properties root

Scala 学习

1.强类型语言 弱类型语言 强类型语言:定义对象或变量时,需要指定其归属类型 一旦一个变量类型确定,它所归属的类型不可再变 弱类型语言:定义变量时不用指定变量类型 在程序运行中,可以改变变量的的归属类型 scala变量定义: var str = "abcd" java: String str = "abcd" 这样写法不是没有指定str的类型,而是没有显式的指定str的类型,它隐式的从变量值中自动判断 显式写法: var str:String = "abc

Scala集合

Scala有一个非常通用,丰富,强大,可组合的集合库:集合是高阶的(high level)并暴露了一大套操作方法.很多集合的处理和转换可以被表达的简洁又可读,但不审慎地用它们的功能也会导致相反的结果.每个Scala程序员应该阅读 集合设计文档:通过它可以很好地洞察集合库,并了解设计动机. scala集合API:http://www.scala-lang.org/docu/files/collections-api/collections.html. 怎样使用集合,请参考 Effective Sc

Java 下一代: Groovy、Scala 和 Clojure 中的共同点(一)

探究这些下一代 JVM 语言如何处理操作符重载 编程语言中的好理念可以延续并扩展到其他语言,就像美酒一样历久弥香.因此,不足奇怪的是,Java 下一代语言 - Groovy.Scala 和 Clojure - 具有很多共同的特性.在本期和下一期 Java 下一代 文章中,我将探讨每种语言语法中功 能清单的一致性.我从能够重载操作符这个特性说起  - 克服了Java 语言中长期存在的一个缺点. 操作符重 载 如果您改造过 Java BigDecimal 类,可能看到过类似于清单 1 的代码: 清单

Java 下一代: Groovy、Scala 和 Clojure 中的共同点(二)

了解Java 下一代语言如何减少样板代码和降低复杂性 Java 编程语言诞生时所面临的限制与如今的开发人员所面临的条件有所不同.具体来讲,由于上世纪 90 年代中期的硬 件的性能和内存限制,Java 语言中存在原语类型.从那时起,Java 语言不断在演化,通过自动装箱(autobox)消除了许 多麻烦操作,而下一代语言(Groovy.Scala 和 Clojure)更进一步,消除了每种语言中的不一致性和冲突. 在这 一期的文章中,我将展示下一代语言如何消除一些常见的 Java 限制,无论是语法上

Scala程序中如何实现多态和动态绑定

在10.4节中你看到了类型Element的变量可以指向类型ArrayElement的对象.这种现象的名字叫多态:polymorphism,是指"许多形状"或"许多形式"的意思.这种情况下,Element对象可以有许多形式.这种类型的多态被称为子类型化多态:subtyping polymorphism.Scala里另一种类型的多态,称为统一多态:universal polymorphism,将在第19章讨论.目前为止,你已经看到了两种形式:ArrayElement和L

Scala的原始类型是如何实现的

这些都是怎么实现的?实际上,Scala以与Java同样的方式存储整数:把它当作32位的字.这对在JVM上的效率以及与Java库的互操作性方面来说都很重要.标准的操作如加法或乘法都被实现为原始操作.然而,当整数需要被当作(Java)对象看待的时候,Scala使用了"备份"类java.lang.Integer.如在整数上调用toString方法或者把整数赋值给Any类型的变量时,就会这么做.需要的时候,Int类型的整数能被透明转换为java.lang.Integer类型的"装箱整

Scala的类层级:与Java类之异同

图释 11.1 Scala 类层级图 图释11.1展示了Scala的类层级的大纲.层级的顶端是类Any,定义了包含下列的方法: final def ==(that: Any): Boolean final def !=(that: Any): Boolean def equals(that: Any): Boolean def hashCode: Int def toString: String 因为每个类都继承自Any,Scala程序里的每个对象都能用==,!=或 equals比较:用hash

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

一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person { var name: String = _ /** * 从构造器 * @param name */ def this(name: String) = { this //注意:从构造器,必须先调用主构造器 this.name = name; } override def toString = { "