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   \
三个双引号 """…""" 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

 

你可能感兴趣的:(项目管理)