groovy语法

目录

标识符中的引号标识符

字符串

插值字符串

闭包插值表达式

groovy中的groovy.lang.GString与java中的java.lang.String互转

字符串总结表格

字符

数字

整数字面量

非 10 进制数

小数

下划线

数字后缀

数学运算中的转型表

除法运算和幂运算的情况

集合

列表、数组

键值对


本章介绍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

插值字符串

何为插值?指的是插值字符串。

有两种插值方法:

  1. ${} ,花括号里面填入表达式
  2. $ 后面直接跟点号表达式

最后用 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 \
三个双引号"""…"""YesYes\
斜杠/…/YesYes\
美元加斜杠$/…/$YesYes$

字符

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

数字后缀

可以用数字后缀表示类型

TypeSuffix
BigIntegerG or g
LongL or l
IntegerI or i
BigDecimalG or g
DoubleD or d
FloatF 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

数学运算中的转型表

除了除法和幂运算以外,不同数据类型经过二元操作符数学运算以后,结果的数据类型如下表:

 bytecharshortintlongBigIntegerfloatdoubleBigDecimal
byteintintintintlongBigIntegerdoubledoubledouble
char intintintlongBigIntegerdoubledoubledouble
short  intintlongBigIntegerdoubledoubledouble
int   intlongBigIntegerdoubledoubledouble
long    longBigIntegerdoubledoubledouble
BigInteger     BigIntegerdoubledoubledouble
float      doubledoubledouble
double       doubledouble
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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值