目录
groovy中的groovy.lang.GString与java中的java.lang.String互转
本章介绍Groovy编程语言的语法。语言的语法源自Java语法,但是使用Groovy的特定构造对其进行了增强,并允许某些简化。
标识符中的引号标识符
将标识符放在引号中,就可以使用一些特殊字符了
def map =[:]
map."an identifier with a space and double quotes"="ALLOWED"
map.'with-dash-signs-and-single-quotes'="ALLOWED"
assert map."an identifier with a space and double quotes"=="ALLOWED"
assert map.'with-dash-signs-and-single-quotes'=="ALLOWED"
Groovy 中的几种字符串都可以作为引号标识符
map.'single quote'
map."double quote"
map.'''triple single quote'''
map."""triple double quote"""
map./slashy string/
map.$/dollar slashy string/$
GString 也可以作为引号标识符,非常动态
def firstname = "Homer"
map."Simson-${firstname}" = "Homer Simson"
assert map.'Simson-Homer' == "Homer Simson"
字符串
Groovy 中有两种字符串
- 普通字符串
java.lang.String
- 插值字符串
groovy.lang.GString
插值字符串
何为插值?指的是插值字符串。
有两种插值方法:
${}
,花括号里面填入表达式$
后面直接跟点号表达式
最后用 toString()
求值
def name = 'Guillaume' // a plain string
def greeting = "Hello ${name}"
assert greeting.toString() == 'Hello Guillaume'
在花括号中,数学表达式也可以使用
def sum = "The sum of 2 and 3 equals ${2 + 3}"
assert sum.toString() == 'The sum of 2 and 3 equals 5'
在花括号中不仅可以使用表达式,也可以使用语句,但是语句没有返回值,因此插值表达式中的最后一条语句应该有个返回值。例如:"The sum of 1 and 2 is equal to ${def a = 1; def b = 2; a + b}"
闭包插值表达式
使用 ${→}
加入一个闭包插值表达式。闭包表达式只能接受零个或者一个参数,多于一个参数将抛出异常。
- 没有参数的时候,闭包的值就是最后一个表达式的值
- 有一个参数的时候,传入的参数类型为
java.io.StringWriter
,壁报返回值就是这个对象
def sParameterLessClosure = "1 + 2 == ${-> 3}"
assert sParameterLessClosure == '1 + 2 == 3'
def sOneParamClosure = "1 + 2 == ${ w -> w << 3}"
assert sOneParamClosure == '1 + 2 == 3'
因为闭包可以包含外部状态变量,因此使用闭包插值可以惰性求值,例如下面的代码
def number = 1
def eagerGString = "value == ${number}"
def lazyGString = "value == ${ -> number }"
assert eagerGString == "value == 1"
assert lazyGString == "value == 1"
number = 2
assert eagerGString == "value == 1"
assert lazyGString == "value == 2"
单引号字符串和三个单引号字符串都是普通字符串 java.lang.String
,不支持插值。双引号字符串和三个双引号字符串中如果没有出现插值表达式,则就是普通的 java.lang.String
;如果出现了插值表达式,则是 groovy.lang.GString。
groovy中的groovy.lang.GString与java中的java.lang.String互转
当一个方法需要 java.lang.String
,但是传入了一个 groovy.lang.GString
参数的时候,将自动调用 toString()
方法进行转换,如下:
String takeString(String message) {
assert message instanceof String
return message
}
def message = "The message is ${'hello'}"
assert message instanceof GString
def result = takeString(message)
assert result instanceof String
assert result == 'The message is hello'
字符串总结表格
字符串类型 | 语法 | 差值 | 多行 | 转义符 |
---|---|---|---|---|
单引号 | '…' | \ | ||
三引号 | '''…''' | Yes | \ | |
双引号 | "…" | Yes | \ | |
三个双引号 | """…""" | Yes | Yes | \ |
斜杠 | /…/ | Yes | Yes | \ |
美元加斜杠 | $/…/$ | Yes | Yes | $ |
字符
Groovy 中没有单独的字符类型,可以将字符串类型“显式转换”成字符类型
char c1 = 'A'
assert c1 instanceof Character
def c2 = 'B' as char
assert c2 instanceof Character
def c3 = (char)'C'
assert c3 instanceof Character
数字
整数字面量
和 Java 中一样有以下几种整数:
byte
char
short
int
- 如果没有什么类型,这是默认类型long
java.lang.BigInteger
他们都是原生类型
// primitive types
byte b = 1
char c = 2
short s = 3
int i = 4
long l = 5
// infinite precision
BigInteger bi = 6
def
关键字定义的变量会自动确认整数的长度和并相应地向long、BigInteger转型(def默认的是整数,无论正负)。
非 10 进制数
二进制以 0b
开头、八进制以 0
开头、十六进制以 0x
开头
#2进制
long xLong = 0b101101101101
assert xLong == 2925l
BigInteger xBigInteger = 0b111100100001
assert xBigInteger == 3873g
int xNegativeInt = -0b10101111
assert xNegativeInt == -175
#8进制
long xLong = 0246
assert xLong == 166l
BigInteger xBigInteger = 01111
assert xBigInteger == 585g
int xNegativeInt = -077
assert xNegativeInt == -63
#16进制
long xLong = 0xffff
assert xLong == 65535l
BigInteger xBigInteger = 0xaaaa
assert xBigInteger == 43690g
Double xDouble = new Double('0x1.0p0')
assert xDouble == 1.0d
int xNegativeInt = -0x77
assert xNegativeInt == -119
小数
小数有以下几种类型:
float
double
java.lang.BigDecimal
- 如果没有声明类型,这是默认类型
// primitive types
float f = 1.234
double d = 2.345
// infinite precision
BigDecimal bd = 3.456
科学计数法
assert 1e3 == 1_000.0
assert 2E4 == 20_000.0
assert 3e+1 == 30.0
assert 4E-2 == 0.04
assert 5e-1 == 0.5
Groovy 默认使用 BigDecimal 作为小数的类型,要使用另外两种类型需要显式声明。
下划线
可以用下划线分割数字,更容易阅读
long creditCardNumber = 1234_5678_9012_3456L
long socialSecurityNumbers = 999_99_9999L
double monetaryAmount = 12_345_132.12
long hexBytes = 0xFF_EC_DE_5E
long hexWords = 0xFFEC_DE5E
long maxLong = 0x7fff_ffff_ffff_ffffL
long alsoMaxLong = 9_223_372_036_854_775_807L
long bytes = 0b11010010_01101001_10010100_10010010
数字后缀
可以用数字后缀表示类型
Type | Suffix |
---|---|
BigInteger | G or g |
Long | L or l |
Integer | I or i |
BigDecimal | G or g |
Double | D or d |
Float | F or f |
Examples:
assert 42I == new Integer('42')
assert 42i == new Integer('42') // lowercase i more readable
assert 123L == new Long("123") // uppercase L more readable
assert 2147483648 == new Long('2147483648') // Long type used, value too large for an Integer
assert 456G == new BigInteger('456')
assert 456g == new BigInteger('456')
assert 123.45 == new BigDecimal('123.45') // default BigDecimal type used
assert 1.200065D == new Double('1.200065')
assert 1.234F == new Float('1.234')
assert 1.23E23D == new Double('1.23E23')
assert 0b1111L.class == Long // binary
assert 0xFFi.class == Integer // hexadecimal
assert 034G.class == BigInteger // octal
数学运算中的转型表
除了除法和幂运算以外,不同数据类型经过二元操作符数学运算以后,结果的数据类型如下表:
byte | char | short | int | long | BigInteger | float | double | BigDecimal | |
---|---|---|---|---|---|---|---|---|---|
byte | int | int | int | int | long | BigInteger | double | double | double |
char | int | int | int | long | BigInteger | double | double | double | |
short | int | int | long | BigInteger | double | double | double | ||
int | int | long | BigInteger | double | double | double | |||
long | long | BigInteger | double | double | double | ||||
BigInteger | BigInteger | double | double | double | |||||
float | double | double | double | ||||||
double | double | double | |||||||
BigDecimal | BigDecimal |
除法运算和幂运算的情况
详从网络略。
集合
列表、数组
详从网络略。
键值对
Groovy 的键值对是 java.util.LinkedHashMap
类型,可以用方括号来访问,也可以用点号来访问。
def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']
assert colors['red'] == '#FF0000'
assert colors.green == '#00FF00'
colors['pink'] = '#FF00FF'
colors.yellow = '#FFFF00'
字符串变量不能作为键
def key = 'name'
def person = [key: 'Guillaume']
assert !person.containsKey('name')
assert person.containsKey('key')
用括号括起来则可以
person = [(key): 'Guillaume']
assert person.containsKey('name')
assert !person.containsKey('key')
笔记出处:https://www.jianshu.com/p/1339ab4f35dd
原文出处:http://groovy-lang.org/syntax.html