Groovy学习笔记(二)—— 从Java到Groovy

之前就有说过,很多人之所以选择Groovy就是因为其学习成本低,只要你有Java的基础,学起来相当快。与此对比的是Scala(另一种JVM动态语言)语法就比较难学(虽然还没学过,但是网上的评论是这样的)。

作为一个Java程序员,我要逐渐把自己Groovy。

从JDK到GDK

1、JDK作为Java开发的核心,是所有Java程序员都需要学习和使用的部分。Groovy在设计GDK的时候非常贴心贴心贴心(重要的感情抒发三遍),GDK可以认为是JDK的扩展和超集,很多Java API在GDK里你都可以找到,甚至是Java文件都可以用Groovy编译运行,这为混合使用Java和Groovy提供了极大的便利,Java程序员可以以极低的代价来嵌入Groovy代码,扩展Java,提高编写效率。

2、Groovy与Java的血缘佐证

1 def str = "I‘m a String"
2 println str.class.name

运行结果:

1 java.lang.String
2 [Finished in 0.7s]

可以看出,Groovy中的对象其实就是Java对象,虽然它可能已经被扩展了。

再来一个例子:

1 def num = 3
2 num.upto(5){println "$it"}
3 println num.class.name

运行结果:

1 3
2 4
3 5
4 java.lang.Integer
5 [Finished in 0.7s]

Groovy扩展了Integer,加入了upto()方法。

Groovy是轻量化的Java(各种省)

再次重申这一点,主要是因为在学习Groovy的过程中,经常会有这样的感叹“唉,这个竟然不需要做了”又或者是“这个竟然可以这么简单的写!”,其轻量、快捷的特点体现在许多方面。

1、安全导航操作符(?.)

Java里充斥着if (obj != null){obj.doSomething();}的代码,但是在Groovy里,仅需obj?.doSomething()。瞬间感觉Java弱爆了~

2、分号可省,引用可以不具名(用def就可以了)

3、不想catch就不用处理异常,而不是Java里被throws逼的必须写

4、return也可以省

5、getter、setter也省了,类似car.engine其实是调用car.getEngine()

6、具名参数(再也不用记住参数顺序了)

7、多赋值(感觉学的python,不需要为了返回多值而建个莫名其妙的类了)

8、通过使用as和asType,代码块可以直接作为接口的实现被传入

9、更便捷的循环 例如for(i in 0..100){}

10、静态导入,导入静态方法(类似于python,可以使用as创建别名),直接通过方法名引用

11、编译时不进行类型检查的范型(Groovy只会在运行时推断,推断失败了就抛异常)

12、类似于lombok的注解

13、操作符重载(在设计DSL的时候超级有用)

好吧,Groovy也有我讨厌的部分(学到目前而言)

1、布尔值的求解

不同类型的规则竟然还不一样,比如Collection非空为true,Number不为0等等。隐式就是灾难啊!谁知道动态运行时莫明奇妙的拿了个什么类型的对象拿去判断,计算布尔值。

Groovy设计者给Java程序员挖的坑:

1、Groovy中的==等于Java中的equals()方法,Java中的==用来判断引用是否相同,在Groovy中对应is()方法

2、Java代码中如果变量名为it这样的Groovy关键字,会报错。

简单总结下,除了一小部分不同外,Groovy的语法与Java极为相似,相互的兼容性很好;Groovy就是Java的动态扩展。

时间: 2024-08-08 09:37:15

Groovy学习笔记(二)—— 从Java到Groovy的相关文章

Java基础学习笔记二十三 Java核心语法之反射

类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任何类被使用时系统都会建立一个Class对象. 链接指的是将Java类的二进制代码合并到JVM的运行状态之中的过程.在链接之前,这个类必须被成功加载.类的链接包括验证.准备和解析等几个步骤. 验证:是否有正确的内部结构,并和其他类协调一致. 准备:负责为类的静态成员分配内存,并设置默认初始化值 解析:

Java学习笔记二:初始化(一)

1.对象初始化 在使用 new 初始化对象时,系统通常使用默认的构造函数,这个构造函数没有返回值,格式为: public class InitializeTest { private int a; // 默认构造函数 public InitializeTest() { } // 自定义构造函数 public InitializeTest(int a) { this.a = a; } } 虽然在使用 new 创建实例时,返回了这个对象的引用,但是这个与没有返回值的void方法不同 //void方法

Java学习笔记二:数据类型

Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围从-2 147 483 6至2 147 483 647 超过20亿,如果用来存储大于20亿的值,最好使用long型. 1.2  int 与Integer: Java中的数据类型分为基本数据类型和复杂数据类型.Int为前者,integer为后者. Integer是int的封装类,提供了很多转换方法,当

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

lucene学习笔记(二)

package index; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIn

Ajax学习笔记(二)

二.prototype库详解 1.prototype库的使用 //导入下载好的prototype.js文件 <script type="text/javascript" src="prototype.js"></script> //在自己的js中直接使用Prototype对象 <script type="text/javascript"> document.writeln("Prototype库的版本

Cookie学习笔记二:Cookie实例

今天说说刚刚学到的两个Cookie的最经典应用:自动登录和购物车设置 一:自动登录 需要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp处理登录信息:如果有Cookie,则自动登录,否则创建输入信息的对象的Cookie,下次登录可以直接登录,但是我们在这里给Cookie设置一个最大保存时间30s,即登录30s后会自动退回到登陆页面,具体代码如下: login.jsp: <%@ page language="java" con