33. Groovy 语法 选择性(Optionality)和truth知识

2023-02-23 17:47:12 浏览数 (2)

1. 介绍

本篇内容, 介绍Groovy中的选择性和truth相关知识点。

2. 选择性-Optionality

主要介绍Groovy中的各种可选性的地方。所谓的可选性就是语法中可以省略的地方,也可以写上的地方。

可写可不写,都不影响整个语法的解析和含义。叫做语法的选择性。

2.1 可选的括号

如果至少有一个参数并且没有歧义,方法调用可以省略括号:

代码语言:javascript复制
println 'Hello World'
def maximum = Math.max 5, 10

上面是省略了括号的,我们如果添加上括号的写法为:

代码语言:javascript复制
println('Hello World')
println(Math.max(5, 10))

在这种不会产生歧义的地方,我们可以省略括号。

PS:实际工作中,建议大家尽量添加括号,因为可以规范语法。避免误解。

2.2 可选的分号

在Groovy中,如果行仅包含一条语句,则可以省略行末尾的分号;

例如:

代码语言:javascript复制
assert true;

可以省略为:

代码语言:javascript复制
assert true

Ps: 关于Groovy中的分号,现在约定成俗的写法就是不给代码中添加分号,统一都不进行添加了。

但是如果一行中有多段代码。还是需要添加上分号的。如果是一行代码就可以省略掉分号了。

代码语言:javascript复制
boolean a = true; assert a

2.3 可选的 return 关键字

在Groovy中,返回在方法或闭包体中计算的最后一个表达式。这意味着return关键字是可选的。

带return关键字的写法为:

代码语言:javascript复制
int add(int a, int b) {
    return a b
}
println add(1, 2) //输出:3

我们知道,最后一句代码是方法的返回值。可以省略掉return:

代码语言:javascript复制
int add(int a, int b) {
    a b
}
println add(1, 2) //输出:3

两者是等效的。

2.4 可选的 public 关键字

默认情况下,Groovy类和方法是公共的。因此,该类的public 关键字可以省略:

代码语言:javascript复制
public class Server {
    public String toString() { "a server" }
}

可以省略为:

代码语言:javascript复制
class Server {
    String toString() { "a server" }
}

但是一点也不影响该类的在其他地方的使用。

3. 表达式的真假-Truth

主要介绍Groovy中的一些比较值的true的返回情况。

Groovy通过应用下面给出的规则来决定表达式是真还是假。

3.1 Boolean 表达式

如果对应的布尔值为True,则为True。

代码语言:javascript复制
println true //输出: true
println !false //输出: true

3.2 集合和数组Arrays

非空集合和数组为true。反之为false。

代码语言:javascript复制
assert  [1, 2, 3] //输出: true
println ![]  //输出 true;

3.3 匹配器

如果匹配器至少有一个匹配项,则为True。

代码语言:javascript复制
assert ('a' =~ /a/)
assert !('a' =~ /b/)

常见的就是正则表达式的匹配逻辑了。

3.4 迭代器和枚举

具有其他元素的迭代器和枚举被强制为true。

代码语言:javascript复制
assert [0].iterator()
assert ![].iterator()
Vector v = [0] as Vector
Enumeration enumeration = v.elements()
assert enumeration
enumeration.nextElement()
assert !enumeration

3.5 Maps对象

非空映射的计算结果为true。

代码语言:javascript复制
assert ['one' : 1]
println ![:] //输出 true

3.6 Strings对象

非空字符串、GStrings和CharSequences被强制为true。

代码语言:javascript复制
assert 'a'
assert !''
def nonEmpty = 'a'
assert "$nonEmpty"
def empty = ''
assert !"$empty"

3.7 数值类型

非零数字为true。

代码语言:javascript复制
assert 1
assert 3.5
assert !0

3.8 对象引用

非空对象引用被强制为true。

代码语言:javascript复制
assert new Object()
assert !null

3.9 使用asBoolean()自定义true

为了自定义groovy是将对象求值为true还是false,需要自定义实现asBoolean()方法:

代码语言:javascript复制
class Color {
    String name

    boolean asBoolean(){
        name == 'green' ? true : false 
    }
}

Groovy将调用此方法将对象强制为布尔值,例如:

代码语言:javascript复制
assert new Color(name: 'green')
assert !new Color(name: 'red')

4. 小结

本篇内容介绍了一些Groovy中的可选性内容,告诉我们在代码中哪些地方是可以省略不用写的。

同时也告诉了各种数据对象在进行boolean判断时,什么情况下为true,什么情况下为false。

这个判断在实际工作使用中还是很有意义的。也将会大量的使用。这个是一个需要了解弄明白的知识点。

以上内容也可以通过Groovy的官方文档:Groovy Language Documentation (groovy-lang.org) 了解和学习。

下篇,继续介绍语法相关的知识 Typing。如果觉得介绍的内容还可以,希望能给我点个赞鼓励一下。谢谢。

0 人点赞