Groovy探索 自定义Range 一 一个简单的自定义Range类

这将是一个系列的文字,用来扩展我们对于自定义Range类的使用思路。也许我们在Groovy语言的编码不知不觉的使用到了Range类,甚至没有觉察到它的存在;或者我们在Groovy语言的编码过程中,常常惊叹于使用Range类的方便,但仅仅是惊叹而已,我们没有付之行动;或者我们想在实际编码中使用自定义的Range类,但却找不到使用它的适当地方。等等,所有这些,希望在读完我们的这个系列后,我们能够将被动的使用Range类,转化为主动的使用我们自定义的Range类。

Groovy语言引入的一个重要概念就是Range。有了Range,我们可以写出形如下面的样子的代码来:

(1..10).each{
print it
}
println ''

运行结果为:

12345678910

我们在Groovy语言的代码中,到处都可以找到Range的身影。使用起来非常的方便,在这里我们就不多说了。

Groovy语言除了给我们引入了Range的概念,还有一个革新之处是我们可以自定义Range。能够自定义Range类,我们肯定是欢迎的,因为在初始化一个集合类对象的时候,我们使用List或数组,需要把它们的所有元素都实例化出来,然后放到容器里;而我们在使用Range的时候,只需要实例化首尾两个元素,就可以获取到集合类对象。当然是极大的方便了我们。

多说无凭,我们还是先来看看一个自定义Range类的例子吧。

这个例子说的是,一个部门有五个科室,我们需要遍历所有科室的情况。

要自定义一个Range类,我们要做的工作首先是让这个类实现"Comparable"接口,然后在该类里依次实现"next"、"previous"和"compareTo"方法即可。当然,这些方法都是Range类对象用来遍历用的,非实现不可。

现在来看我们自定义的科室代码:

class Section implements Comparable{
def SECTION_TYPE = ['Yike','Erke','Sanke','Sike','Wuke']
private index = 0
public Section(type)
{
this.index = SECTION_TYPE.indexOf(type)
}
Section next()
{
new Section(SECTION_TYPE[(index+1)%SECTION_TYPE.size()])
}
Section previous()
{
new Section(index-1)
}
int compareTo(Object other)
{
index<=>other.index
}
public String toString()
{
SECTION_TYPE[index]
}

}

整个类也十分的简单,"SECTION_TYPE"用来定义科室的代码,以便Range类对象能够自动实例化一个科室。

"index"变量是用来在遍历时确定位置的。

"next"方法是用来往后遍历,"previous"方法是用来往前遍历,"compareTo"方法用来比较两个元素的位置。这都是Range类必须实现的方法。

在所有的自定义Range类中,它们的实现逻辑都大同小异。

而"toString"方法才是科室类自己的方法,当然,我们可以在科室类里定义很多科室类要用到的其他方法,在本例中,为了简单起见,就不再多定义其他方法了。

下面,我们就可以来测试这个自定义的Range类了:

def yike = new Section('Yike')
def wuke = new Section('Wuke')
(yike..wuke).each{
println it.toString()
}

运行的结果为:

Yike
Erke
Sanke
Sike
Wuke

我们再回过头来看测试代码,在代码中,我们只初始化了两个科室对象,如下所示:

def yike = new Section('Yike')
def wuke = new Section('Wuke')

就可以进行五个对象的遍历了。如果我们使用List对象,那么代码将是下面的这个样子的:

def list = [new Section('Yike'),
new Section('Erke'),
new Section('Sanke'),
new Section('Sike'),
new Section('Wuke')]
list.each{
println it.toString()
}

这个很简单的例子当然初步的显示了自定义Range类的优越性,但是自定义的Range类绝不止这么简单,它还有更为广阔的舞台。

这将是本系列文字的下一个部分将要说到的。

时间: 2024-12-27 13:22:37

Groovy探索 自定义Range 一 一个简单的自定义Range类的相关文章

PHP实现的一个简单的数据库操作类

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $username; private $password; public $default_db; public $link; // 声明构造函数 public f

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame, 子控件要添加到contentView中) 进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片) 3.提供2个模型 数据模型: 存放文字数据\图片数据 frame模型: 存放数据模型\所有子控件的frame\cell的高度

一个简单的链表模版类的实现

这是翻阅<数据结构.算法与应用--C++语言描述> 以及在网上得到的一些资料后写出来的.起因是在项目中要用到一个链表,但我做一个简单的链表在C++中用的时候跟C差别很多,比如赋值运算(编译器说要做操作符重载,或者考贝构造函数,C++中把结构当成一个类来看了,详见相关介绍的文档或书籍).后来一想干脆做个template顺便学习一下,一举两得. 几个问题: CListData和CNode的函数均为内联函数(inline),因为目前的编译器仍不支持分离编译.按<Thinking in C++&

一个简单的Generic Factory类

简单的工厂类的一个使用场景是,假设有一个基类 BaseClass,和一系列的子类 A,B,C,工厂类根据某个参数,例如字符串 "A", "B", "C" 创建出相应的子类. 举例如下: public class Factory { public static BaseClass Create(string name) { switch (name) { case "A": return new A(); case "

一个简单的php路由类_php技巧

本文实例为大家分享了php编写一个简单的路由类,供大家参考,具体内容如下 <?php namespace cmhc\Hcrail; class Hcrail { /** * callback function * @var callable */ protected static $callback; /** * match string or match regexp * @var string */ protected static $match; protected static $rou

艾伟_转载:一个简单的 Generic Factory 类

简单的工厂类的一个使用场景是, 假设有一个基类 BaseClass, 和一系列的子类 A, B, C, 工厂类根据某个参数,例如字符串 "A", "B", "C" 创建出相应的子类. 举例如下: public class Factory { public static BaseClass Create(string name) { switch (name) { case "A": return new A(); case &

iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局

一.项目文件结构和plist文件 二.实现效果 三.代码示例 1.没有使用配套的类,而是直接使用xib文件控件tag值操作 数据模型部分: YYtg.h文件 1 // 2 // YYtg.h 3 // 01-团购数据显示(没有配套的类) 4 // 5 // Created by apple on 14-5-29. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import <Foundation/Foundatio

一个简单的自定义程序日志小样例_实用技巧

复制代码 代码如下: using System; using System.IO; using System.Text; public class LogInfo { private string ErrorInfo_User = ""; // 记录用户自定义错误信息 private string ErrorPosition = ""; // 记录错误的位置信息,可包括类.函数等 private string ErrorInfo_Sys = ""

一个简单的上传类

上传 一直以来,很多项目都要求上传,每次都要写上传的代码,比较麻烦.便想写一个类来完成上传的任务,以便在开发中减轻负担.写的很简单,但确实实用^_^ using System;using System.Web;using System.IO;using System.Text; namespace upfile{ /// /// upfile类完成文件的上传和删除功能 /// public class MyUpload { private System.Web.HttpPostedFile po