前言
上一篇我们已经讲解过Groovy
的变量,这一篇主要讲解Groovy
的字符串
字符串讲解
首先看一下我们的思维导图
在 Groovy
中字符串分为两种类型,一种是java.lang.String
,另一种是groovy.lang.GString
.第一种和我们的Java
一样就不多少了,主要说下这个GString
常用三种定义方式
第一种:单引号定义
我们运行下看下结果
那如果我们想要的字符串中有单引号'
怎么办呢?用\'\'
包裹起来即可
我们打印下,看看这个b
是不是用单引号包裹起来
和我们预期的一样,同时我们发现返回的类型都是Java.lang.String
,说明单引号这种定义方式和我们Java
中的String
是一样的
第二种,三个单引号定义
我们运行下看看结果
返回类型也是Java.lang.String
,那这个和单引号定义方式有啥区别呢?主要就是样式上,这个三个单引号定义的字符串可以指定样式,比如换行,不需要加\n
,代码表示上也不需要用+
号拼接,我们写个简单的例子
这里我们看见打印出来的结果就是我们写好的
第三种,双引号定义
我们先写一个简单的
这里我们发现,返回的依旧是Java.lang.String
类型,说明这个和我们Java
的String
也一样,那都一样搞这么多有必要吗?这个双引号定义的字符串还有一种最主要的功能就是可扩展
,上面几种定义的方式,我们这个内容是不可变的,但是我们用过双引号定义的可就不一样了,我们写个例子
这里我们就可以发现,双引号定义的字符串是可以动态改变的,只需要用${}
包裹起来就行,同时它的返回值不再是Java.lang,String
,而是org.codehaus.groovy.runtime.GStringImpl
,也就是GString
,同样是双引号定义的字符串,如果你的里面有这种扩展表达式,使用的就是GString
这个${}
里面不仅可以是变量,它可以是任意的表达式,我们写个例子验证下
既然有String
和GString
,那么他俩能直接调用吗?还是说必须得强转成一样的才能调用?答案是可以相互直接调用的,我们举个小例子
这里我们写了个方法echo
,返回值是String
,入参也是String
,这里我们调用这个方法时传入的是doubleName3
,我们之前打印过他的类型是GString
,也就是说两者是可以相互调用的
新增操作符
首先我们看下思维导图
虽然String
中方法有很多,但是主要来源就三种
java.lang.String、DefaultGroovyMethods、StringGroovyMethods(普通类型的参数、闭包类型的参数)
Java.lang.String
这里边的方法我们基本上就不用学习了,我们在Java
中使用的比较多了
- DefaultGroovyMethods
这里面的方法我们也不用太关心,因为StringGroovyMethods
继承自DefaultGroovyMethods
,也基本都重写了其中的方法
- StringGroovyMethods
这个就是我们最主要关心的了,这一篇我们主要讲解普通类型参数的方法,至于闭包类型参数我们会在后面闭包实战中讲解
我们打开我们的IDEA
,找到StringGroovyMethods
这个类,我们会发现里面有许许多多的方法,我们只能是挑选常用的来讲解下,剩下的用到的时候在说
center方法
public static String center(CharSequence self, Number numberOfChars) {
return center((CharSequence)self, numberOfChars, (CharSequence)" ");
}
public static String center(CharSequence self, Number numberOfChars, CharSequence padding) {
int numChars = numberOfChars.intValue();
if (numChars <= self.length()) {
return self.toString();
} else {
int charsToAdd = numChars - self.length();
String semiPad = charsToAdd % 2 == 1 ? getPadding(padding, charsToAdd / 2 + 1) : getPadding(padding, charsToAdd / 2);
return charsToAdd % 2 == 0 ? semiPad + self + semiPad : semiPad.substring(0, charsToAdd / 2) + self + semiPad;
}
}
center
方法有两个,一个是一个参数的,一个是两个参数的.第一个参数表示我们新字符串的长度是多少,第二个参数表示我们想用那个字符填充,如果不传的话默认就是空格,使用第二个参数对已有字符串两边进行填充
我们写个例子验证下
我们打印了三个:第一个是新字符串长度为10,默认是空格填充;第二个是新字符串长度为4,用d
填充,但是发现根本每生效,也就是说第一个参数如果比我们原来的字符串长度小,那么就不生效;第三个是新字符串长度为10,用m
填充
padLeft
方法
public static String padLeft(CharSequence self, Number numberOfChars) {
return padLeft((CharSequence)self, numberOfChars, (CharSequence)" ");
}
public static String padLeft(CharSequence self, Number numberOfChars, CharSequence padding) {
int numChars = numberOfChars.intValue();
return numChars <= self.length() ? self.toString() : getPadding(padding.toString(), numChars - self.length()) + self;
}
padLeft
方法有两个,一个是一个参数的,一个是两个参数的.第一个参数表示我们新字符串的长度是多少,第二个参数表示我们想用那个字符填充,如果不传的话默认就是空格,使用第二个参数对已有字符串左边进行填充
我们写个例子验证下
比较
Groovy
中比较字符串可以直接使用>、<
符号来直接比较,而不需要使用compareTo()
取值
Groovy
中获取字符串某个位置的字符直接使用string[index]
,相当于string.getAt(index)
,这个[]里面的index可以是一个具体的数字,也可以是一个范围,用..
连接,包括起点和终点
减法
Groovy
中减去字符串:可以直接使用-
号,效果与Java
中的minus()
一样
我们发现如果前面的字符串不包括后面的,那么结果就是前面的字符串
倒序
首字母大写
是否是数字
OK,我们呢这里主要就有讲解这些,还有很多那就需要我们在使用过程中查看api了
新增API讲解
逻辑控制:顺序逻辑(单步往下执行)、条件逻辑(if/else、switch/case)、循环逻辑(while、for)
条件逻辑
Groovy
中的switch/case
和Java
还是有点不同的.Java
中的switch
只支持固定的几种类型,但是Groovy
中的switch
是支持任意类型的,所以说基本上switch
是可以代替if/else
了
我们写个例子验证下
我们可以看见我们的case
有字符串,列表,Integer,BigDecimal等,这里就写几个示范下Groovy
的switch
支持任意类型
我们看下结果
和我们预期的完全一样
循环逻辑
- 第一种,对范围的
for
循环
- 第二种,对List的循环
- 第三种,对map的循环
Map
循环这里比Java
要便捷,不需要获取迭代器,就能获取相应的key
和value