Why Groovy?
It's been about a year since I joined my company's DevOps team and one of the main tools we use is Jenkins which gets along great with Groovy. I mostly use Groovy for orchestrating pipelines and automating some boring tasks.
Groovy是Java平台的一种强大语言,它可以与任何Java程序顺利集成。 它也是一种很棒的脚本语言,它的语法功能强大且易于学习。
[Groovy]旨在通过简洁的方式提高开发人员的工作效率,熟悉且易于学习 syntax。 它可以与任何Java程序顺利集成,并立即交付给您的应用程序 powerful features, including scripting capabilities, 领域特定语言创作, runtime和compile-time 元编程和功能性编程。
因此,在过去一年中,我学到了10个使我喜欢Groovy的功能:
1. Simplicity
来自Java后端开发团队,对我而言,学习Groovy轻而易举。 它基于Java标准库构建,提供了额外的功能。 它们中的大多数使编程变得更加简单。
1.1 Declaring Lists/Maps
Groovy是一种可选的语言,您可以使用定义关键字来声明变量。 例如,声明列表或地图很简单:
def myList = []
def myMap = [:]
1.2 Iterating over Lists/Maps
而且,使用以下命令迭代它们非常容易且可读关闭:
myList.each {element ->
println element
}
myMap.each {entry ->
println "User: $entry.user | Email: $entry.email"
}
2. String Interpolation
[String]插值是在评估字符串时用其值替换字符串中占位符的行为。
在Groovy中,占位符被$ {}或以$用于点分表达式。
在前面的代码片段中,我们可以看到字符串插值的示例。 但是这是另一个:
try{
throw new Exception()
}catch(Exception e){
println "Error during operation. Cause: ${e}"
}
3. Casting
Groovy使投射变得非常容易,并且可读性强如 operator. To use this operand the c如ted cl如s must implement the 如Type()method. This already happens for standard cl如ses like lists, enumerators, etc.
例如:
enum Employee {
MIKE,
HANNA
}
String name = "JOHN"
try{
name as Employee
}catch(Exception e){
println "Could not find employee ${name}. Cause: ${e}"
}
4. Json to Classes
我经常使用Json响应来处理Web服务,因此不可避免地不得不将响应映射到Groovy类。 这与Groovy一起提供,非常简单,只需将Json传递给类构造函数即可。
String response = '{name:"John", position: "Developer", age: 32}'
// Json response to map
def employeeMap = new JsonSlurper().parseText(response)
// Consider an Employee class with the attributes name, position and age
Employee employee = new Employee(employeeMap)
而已。 我们只是通过Json字符串构建了一个employee对象。
另一种方法很简单:
def json = JsonOutput.toJson(employee)
// json == '{name:"John", position: "Developer", age: 32}'
5. Assertions
Groovy具有相同的断言声明为Java,但功能更强大-因此它的名称-功率断言。
差异是其输出,以防断言解析为假。 例如:
def contacts = ['John', 'Anna']
assert contacts.isEmpty()
//Output:
//ERROR org.codehaus.groovy.runtime.powerassert.PowerAssetionError:
//assert contacts.isEmpty()
// | |
// | false
// [John, Anna]
这使您可以非常轻松地了解使断言失败的原因。
6. Defining variables
Groovy是可选的类型,这意味着您可以使用其类型定义变量或仅使用关键字定义。 在声明列表或地图时,这同样适用,它们的类型是可选的。 例如:
String name
int age
def address
List friends = ['John', 'Anna']
Map family = ['Mother':'Mary', 'Father':'Joseph']
def getFamilyMember("Mother"){ ... }
对于那些了解Javascript的人来说,这类似于关键字变种。
这为您提供了难以置信的灵活性,但是在使用时要格外小心。 这可能会使您的团队或其他人难以使用您的代码阅读代码并了解期望作为输入或输出的内容。
7. Hashing
如果您曾经使用过Java,则可能知道散列字符串的详细程度-除非您使用的是第三方库。
Groovy 2.5为我们带来了一些有用的方法串 class. Calculating hashes is as simple as calling a method on a 串. Groovy makes it simple:
def password = "thisIsMyPassword"
def md5 = password.md5()
def sha256 = password.sha256()
//For other algorithms use digest() method
def sha1 = password.digest('SHA-1')
...
8. Operators
Groovy支持其他语言中最常见的运算符。 但这还不够Groovy提供的一些更有趣的运算符。 这里有一些:
Elvis operator
这是三元运算符的简短版本。 例如,当条件可以评估为null时,这非常有用。
// Instead of this
def user = person.name ? person.name : 'Guest'
// Use this
def user = person.name ?: 'Guest'
Safe navigation operator
可以用来检查变量是否为null的另一个运算符是“安全导航运算符”。
def user = person?.name
// user == null
如果要避免使用此运算符空指针异常s。 如果您要访问的对象为空值,则此运算符将返回空值而不是扔一个空指针异常。
Spread Operator
点差运算符(。*)用于对Collection的所有项目执行操作,而不是像我们之前看到的那样使用循环或闭包。 例如:
def numbers = [1,2,3,4,5,6]
*numbers // == [1,2,3,4,5,6]
def people = [
new Person(name: 'John', age: '25'),
new Person(name: 'Anna', age: '21')
]
def friends = people*.name // friends = ['John', 'Anna']
9. Traits
特质是该语言的结构结构,它可以:行为组成接口的运行时实现行为重载与静态类型检查/编译的兼容性
我喜欢将特征视为可以实际实现方法的接口。 当您有一个非常复杂和结构化的应用程序并且想要保持整洁时,此功能非常有用。
绝对是我在早期Java中错过的东西。
这是一个例子:
trait Sociable {
void greet() { println "Hello!" }
}
class Person implements Sociable {}
Person p = new Person()
p.greet() // Hello!
10. Regular Expressions
Groovy本机支持正则表达式,这非常简单。 它具有3个用于正则表达式的运算符:
- 〜这是模式运算符,这是创建的实例的简单方法java.util.regex.Pattern:
def pattern = ~"^abc{2}\d"
// pattern instanceof Pattern == true
- =〜这是查找运算符它将在字符串中查找模式并返回一个匹配器:
def pattern = ~"abc{2}\d"
def found = "abcc5" =~ pattern
// found instanceof Matcher == true
- 最后是匹配运算符==〜whichreturns真正ifthestringisastrictmatchoftheregex:
def found = "abcc5" ==~ pattern
// found == true
Conclusion
如果您多年来一直使用Java或其他OOP语言进行编程,那么Groovy就像是呼吸新鲜空气。
它使事情变得如此容易和简单,并且不再那么冗长。 加上脚本和特定领域语言功能等额外功能,将Groovy推向了一个新的高度,并为旧语言提供了新的新鲜外观。
我希望您觉得这篇文章有趣,如果您对Groovy有任何经验以及如何使用它,请在下面的评论中告诉我。 :)