在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

学习Groovy的特性

2017-2-7 13:42| 发布者: zhangjf| 查看: 450| 评论: 0

摘要: 翻译自 http://sysgears.com/articles/groovy-differences-java/ Groovy基于jvm,是一种面向对象的动态语言。如果你需要编写轻量级的脚本并且想要从Java的生态环境中获益,那么Groovy对于你来说是再合适不过的候选者 ...

翻译自 http://sysgears.com/articles/groovy-differences-java/

Groovy基于jvm,是一种面向对象的动态语言。如果你需要编写轻量级的脚本并且想要从Java的生态环境中获益,那么Groovy对于你来说是再合适不过的候选者。Groovy动态得被编译成字节码,并且兼容大部分的Java类库。同时Groovy非常易于学习,因为在Groovy中Java的语法都是有效的。但还是有些注意事项需要你在开始编程之前了解的。这篇文章展现了Groovy的一些特性并提供了一些帮助你编写清晰,groovy-style代码的建议。

Groovy beans

声明Groovy beans是非常简单的。典型的Java bean需要包含构造方法,私有属性和getter / setter 方法。Groovy bean仅仅需要field,getter / setter 方法会被隐式得创建。

  1. class User {
  2. String firstName // bean field
  3. String lastName // bean field
  4. }
  5. def user = new User()
  6. user.firstName = "John"
  7. user.lastName = "Doe"
复制代码

user.firstName和user.lastName会调用setter方法完成任务。如果有必要的话你也可以为field声明自定义getter / setter 方法。下面举个例子:

  1. class User {
  2. String firstName
  3. String getFirstName() {
  4. "The first name is $firstName"
  5. }
  6. void setFirstName(String firstName) {
  7. this.firstName = "[$firstName]"
  8. }
  9. // ...
  10. }
  11. user.firstName = 'John'
  12. println user.firstName
复制代码

{}中的内容通过setter方法添加,"the first name"后面通过getter方法得到。结果是这样:

  1. The first name is [John]
复制代码

如果为field设置了访问修饰符,那就仅仅创建了field,getter / setter方法不会被自动创建。

Groovy 闭包

Groovy提供了一种创建方法为一等对象的方式————Groovy 闭包。使用闭包,你能够定义代码块并且传递参数,就像它是常规变量一样。

  1. // the simplest closure
  2. def hello = {"Hello, $it!"}
  3. assert hello('Chris') == 'Hello, Chris!'
  4. // the closure that do not take any params
  5. def bye = {->'Bye!'}
  6. assert bye() == 'Bye!'
  7. // the closure with several params
  8. def niceHello = {firstName, lastName -> "Hello, $firstName $lastName!"}
  9. assert niceHello('Chris', 'Bennett') == 'Hello, Chris Bennett!'
复制代码

如上所示,闭包默认持有一个it参数,你可以指定可命名的参数改变这一默认行为。或者声明{-> ...}省略参数。

Groovy list和map

Groovy 为lists和Maps提供了内建的支持,并且允许用类似于JavaScript的方式初始化和操作数据结构。首先,让我们看一眼List的实现,我们可以只用两个[]创建一个空的List。

  1. // an empty list
  2. def emptyList = []
  3. // predefined list
  4. def list = ['One', 'Two', 'Three']
复制代码

或者从List中取出一个或多个元素。

  1. def list = ['One', 'Two', 'Three']
  2. // gets the first element from the list
  3. assert list[0] == 'One'
  4. // gets a range of elements from the list
  5. assert list[1..2] == ['Two', 'Three']
  6. // gets another range
  7. assert list[-1..-2] == ['Three', 'Two']
复制代码

另外为迭代和转化lists提供了一系列可用的便捷操作:

  1. // iterates the list
  2. def emptyList = []
  3. list.each {emptyList << "$it!"}
  4. assert emptyList == ['3!', '1!', '2!']
  5. // iterates the list and transforms each entry into a new value
  6. // using the closure
  7. assert list.collect {it * 2} == [6, 2, 4]
  8. // sorts using the closure as a comparator
  9. assert list.sort {it1, it2 -> it1 <=> it2} == [1, 2, 3]
  10. // gets min or max using closure as comparator
  11. assert list.min {it1, it2 -> it1 <=> it2} == 1
复制代码

Map的实现也有很多的语法糖。可以通过[]和:声明一个空的map:

  1. // an empty map
  2. def emptyMap = [:]
  3. // predefined map
  4. def map = [John: 10, Mark: 20, Peter: 'Not defined']
复制代码

两种风格获取Map的值————bean风格或者数组风格

  1. def map = [John: 10, Mark: 20, Peter: 'Not defined']
  2. // the array style
  3. assert map['Peter'] == 'Not defined'
  4. // the bean style
  5. assert map.Mark == 20
  6. // also you can preset default value that will be returned by
  7. // the get method if key does not exist
  8. assert map.get('Michael', 100) == 100
复制代码

借助闭包实现迭代和转换:

  1. // iterates the map
  2. def emptyMap = [:]
  3. def map = [John: 10, Mark: 20, Peter: 'Not defined']
  4. map.each { key, value ->
  5. emptyMap.put key, "$key: $value" as String
  6. }
  7. assert emptyMap == [John: 'John: 10', Mark: 'Mark: 20',
  8. Peter: 'Peter: Not defined']
  9. // iterates the map and transforms each entry using
  10. // the closure, returns a list of transformed values
  11. assert map.collect { key, value ->
  12. "$key: $value"
  13. } == ['John: 10', 'Mark: 20', 'Peter: Not defined']
  14. // sorts map elements using the closure as a comparator
  15. map.put 'Chris', 15
  16. assert map.sort { e1, e2 ->
  17. e1.key <=> e2.key
  18. } == [John: 10, Chris: 15, Mark: 20, Peter: 'Not defined']
复制代码
其他有用的

boolean操作符==和Java中的equals相同效果,并且不区分类型。不像Java中==意味着基本类型相等和对象地址相等。如果你要比较对象的地址,使用is方法:

  1. assert [] == []
  2. assert ![].is([])
复制代码

.*操作符被引入用于表示在集合内所有的成员上执行操作:

  1. assert [1, 2, 3] == ['a', 'ab', 'abc']*.size()
复制代码

在方法的末端return是可选的:

  1. def foo() {
  2. // do something
  3. return something
  4. }
  5. // is equals to
  6. def bar() {
  7. // do something
  8. something
  9. }
复制代码
结语

Groovy还有很多有趣的特性:元编程,函数式编程,AST转换。在学习的路途上你一定会发现它们。Groovy的强大之处在于,你可以用基本的Java语法开始,然后逐步学习并且改进代码直到它们真正意义上的灵活和动态。

原文 http://segmentfault.com/a/1190000004126047

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 11:13

Copyright 2015-2025 djqfx

返回顶部