前言
上一篇我们已经讲解过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