热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Scala初探(二)

5.单例模式classMarker(valcolor:String){类中的任何代码段作为构造函数的一部分println(Creating+this)over

5. 单例模式

class Marker(val color: String){
	//类中的任何代码段作为构造函数的一部分
	println("Creating " + this)

	override def toString(): String = "marker color " + color 
}

object MarkerFactory{
	private val markers = Map(
		"red" -> new Marker("red"),
		"blue" -> new Marker("blue"),
		"green" -> new Marker("green")
		)

	def getMarker(color:String) = if(markers.contains(color)) markers(color) else null	
}

println(MarkerFactory getMarker "blue")
println(MarkerFactory.getMarker("blue"))

Scala中创建单例对象特别简单,直接使用object关键字,而非class,因为单实例对象无法初始化,所以不能给它的主构造函数传递参数。Marker类表示对应于原色的彩笔,MarkFactory是一个单例,它预先创建了对应三原色的Marker的实例,这样就可以重用这些实例。

6. 独立对象和伴生对象

//marker的构造函数标记为private,但是伴生对象依然可以访问它
//在marker类或伴生对象之外创建marker实例,就会得到错误信息
class Marker private(val color: String){
	println("Creating " + color)

	override def toString(): String = "marker color " + color
}
//伴生对象
object Marker{
	private val markers = Map(
		"red" -> new Marker("red"),
		"blue" -> new Marker("blue"),
		"green" -> new Marker("green")
		)

	def getMarker(color: String) = if(markers.contains(color)) markers(color) else null
}

println(Marker getMarker "red")
println(Marker getMarker "bule")
println(Marker getMarker "blue")

单例对象MarkerFactory并未关联到任何一个类上。而Scala可以创建一个关联到类上的单例,使用同样的名字,它称为伴生对象;类和伴生对象之间没有界限,它们可以互相访问彼此的private字段和private方法。(Scala中类默认为public)

7. 容器

//容器
import java.util._

var list1: List[Int] = new ArrayList[Int]

list1 add 1
list1 add 2

var total = 0
for(i <- 0 until list1.size()){
	total += list1.get(i)
}


println("The total is " + total)

8. 高阶函数

def totalResultOverRange(number: Int,codeBlock: Int => Int): Int = {
	var result = 0
	for(i <- 1 to number){
		result += codeBlock(i)
	}

	result
}

println(totalResultOverRange(11,i => i))
println(totalResultOverRange(11,i => if(i%2 == 0) 1 else 0))

函数可以作为参数传递给函数,可以从函数中返回,甚至可以在函数中嵌套,这些就是高阶函数。上面例子中的函数参数codeBlock就是一个函数,Int=>Int 表示codeBlock这个函数的参数和返回类型是整型。

9.  具有多参数的高阶函数

def inject(arr: Array[Int],initial:Int,operation: (Int,Int) => Int): Int = {
	var carryover = initial
	arr.foreach(element => carryover = operation(carryover,element))

	carryover
}

val array = Array(2,3,5,1,6,4)
val sum = inject(array,0,(carryOver,elem) => carryOver + elem)

println("Sum of elements in array is " + sum)

val max = inject(array,0,(carryOver,elem) => Math.max(carryOver,elem))
println("Max of the array is " + max)

10. foldLeft()

val array = Array(2,3,5,1,6,4)

val sum = (0 /: array){
	(sum,elem) => sum + elem
}

val max = (Integer.MIN_VALUE /: array){
	(large,elem) => Math.max(large,elem)
}

println("Sum of elements in array is " + sum)
println("Max of elements in array is " + max)

(0 /: array)就相当于foldLeft(),这个方法表示array中每个元素累加,将sum初始化为0,每次累加后将结果返回给sum。


Scala初探(二)


推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • VPX611是北京青翼科技推出的一款采用6U VPX架构的高性能数据存储板。该板卡搭载两片Xilinx Kintex-7系列FPGA作为主控单元,内置RAID控制器,支持多达8个mSATA盘,最大存储容量可达8TB,持续写入带宽高达3.2GB/s。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
author-avatar
吴秋仪6_913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有