加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 17:09:09 所属栏目:大数据 来源:网络整理
导读:这将是一个系列的文字,用来扩展我们对于自定义Range类的使用思路。也许我们在Groovy语言的编码不知不觉的使用到了Range类,甚至没有觉察到它的存在;或者我们在Groovy语言的编码过程中,常常惊叹于使用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类绝不止这么简单,它还有更为广阔的舞台。

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读