《Groovy程序设计》读书笔记之第二部分 面向Java开发者的Groovy(上)

来源:互联网 发布:jdk 7u79 windows x32 编辑:程序博客网 时间:2024/06/08 13:31

本文是《Groovy程序设计》一书的读书整理笔记系列文章
Paste_Image.png

Hello Groovy & Groovy循环 & 异常处理 & 安全导航操作符

下面是一个java文件实现,与groovy实现的对比,我们采用一层层去除groovy来说多余的内容

Greeting.java

public class Greetings {  public static void main(String[] args) {      for (int i = 0; i < 10; i++) {          System.out.print("ho ");      }      System.out.print("Merry Groovy...");   }}

去除分号,去除类和方法定义( 类和方法定义在groovy中默认是public )

Greeting.groovy

for (int i = 0; i < 3; i++) {      System.out.print("ho ")}System.out.print("Merry Groovy...")

当你看到这段代码的时候,你一定回想“这他x的能执行吗?”,当然这句话是我说的,你不会这么粗鲁。

你存在这样的疑问是正常的,我刚看到也是这样的想法,在一个类中,没有类声明,没有方法声明,第一感觉是不能运行。但是事实结果呢?

$shell: ho ho ho Merry Groovy...

完美的运行了。

我们再次精简, 这次动一动for循环 ( * groovy为我们提供了更简洁的for循环 * )

for(i in 0..3){ print('ho ')}print('Merry Groovy...')

输出结果和上面的一样的。

for循环

for循环的其他一些方式
1、upto : 是groovy向java.long.Integer类中添加的一个便于使用的实例方法,可用于迭代。

0.upto(2) {print("$it ")} //这里需要注意,不能使用‘’这种单引号,会当作字符串,输出$it$it$it    

upto可以设置上限、下限

2.upto(10) { print("$it ") } //这里表示从2开始循环到10

2、times :如果upto使用从0开始,可以使用times替代

3.times {print("$it ")} //0 1 2

3、step: step会跳过一些值

0.step(10, 2) {print("$it ")} //这里输出10以内的双数

异常处理

异常处理, 在java中,对于所有受检查异常,都是强制需要处理(例如sleep),但是groovy不强制让我们处理,如果没有处理,则会向上传递到调用处

def openFile(fileName) {    new FileInputStream(fileName) }try {    openFile('hello')} catch (FileNotFoundException ex) {    println "oos->" + ex}

安全操作符 ?.

安全导航操作符,在写java的时候我们很多时候需要进行非空判断,防止NullPointException,现在在Groovy中,我们可以直接使用安全导航操作符实现安全验证

def foo(str) {    //if (str != null) {str.reverse()}    str?.reverse(); //这里使用?.就可以实现上面的判断效果}println foo("evil")println foo(null) //这里输入null,需要进行安全判断?.

对于runtime的简化

println "cmd /C dir".execute().text; 

作用相当于runtime 执行的时候一大段代码

JavaBean & Class & Meth

1、类的定义和参数定义

class Wizard {        def static learn(trick, action)     {                println this                return this //groovy中返回值如果不定义的话,默认作为没有返回值void       }}

这个类包含了一个静态方法,对于静态方法,是可以直接访问的

Wizard.learn('alohomora', {}).learn('expelliarmus', {}) 这里会输出类名

接下来我们看看对于属性定义,在java中,我们访问属性会设置getter,设置属性会设置setter,groovy为对此做了简化。

class Car {  def miles = 0  final year //final 声明的属性只提供一个访问器,不提供更改器Car(theYear) {      year = theYear  }}

对对象进行赋值和访问

Car car = new Car(2008);println "Year: $car.year"println "Miles: $car.miles"car.miles = 25println "Miles: $car.miles"car.year = 1000

这里我们可以对def修饰的属性进行自由的访问和更改,而如果使用final修饰的属性的话,我们只能进行访问,不能更改,因为使用了final修饰的属性不会提供更改器,只提供了访问器,这个和java一致的。

使用private 声明的属性不能在类的外部进行修改,因此要修改private修饰的属性,我们需要提供修改使用的方法。

对于日历我们可以进行代码的写法简化

//Calendar calendar = Calendar.instance //可以使用instance代码替代getInstance()//println calendar.get(Calendar.YEAR)

2、方法定义和多赋值

class Robot {    def type, width, height        def access(location, weight, fragile) {        println "location: $location , weight: $weight , fragile: $fragile"    }}Robot robot = new Robot(type: 'arm', width: 22, height: 30)robot.access(1, 2, 3)

如果一个类没有定义默认的构造器的话,再使用的时候,可以使用map键值对的方式,进行构造初始化

groovy中可以把方法和构造器的形参设置为可选的。可选形参必须位于末尾

def log(x, base = 10) { //这里base为可选形参,当我们不传的时候默认为10    Math.log(x) / Math.log(base)}

groovy中可以直接使用多赋值的方法,一次性对多个参数进行赋值

def splitName(fullName) {    fullName.split(' ')}def (firstname, lastname) = splitName('kima wang')  //使用这种方式副职,完全不需要使用临时变量了println "firstName: $firstname, lastName: $lastname"

多赋值还有一个很好的作用就是可以进行赋值交换

def name1 = 'kima'def name2 = 'wang'println "name1: $name1, name2: $name2"(name1, name2) = [name2, name1]println "name1: $name1, name2: $name2"

在使用多赋值时,如果赋值内容多于参数的话,会丢失多余部分,如果少于的话,会设置为null

def (String cat, String mouse) = ['Tom', 'Jerry', 'Spike']println "$cat and $mouse" //这里只输出tom and jerry , spike丢失def (first, second, third) = ['Tom', 'Jerry']println "$first, $second, $third" //这里输出tom, jerry, null,如果这里的多余变量不能设置为null,则会抛出异常

总结: groovy是轻量级的java

  • 1 、 return语句是可选的
  • 2 、 分号也是可选的
  • 3 、 方法和类默认是公开的(public)
  • 4 、 ?. 操作符只有对象引用不为空时才对分配调用
  • 5 、 可以使用具名参数初始化javabean
  • 6 、 groovy不强迫我们捕获自己不关心的异常 , 这些异常会被传递给代码的调用者
  • 7 、 静态方法内可以使用this来引用class对象 。

本节完, 谢谢查阅。

0 0
原创粉丝点击