基于JVM的动态语言Groovy 基础知识汇总

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 在使用Java的过程中,和C#的语法相比有些还是比较麻烦,比如异常、get set等问题,毕竟Java的发展时间比C#长了很多,很多问题当初设计时没有考虑到,为了向前兼容,不得不保留一定的历史负担(如泛型的处理,java的擦除法实现就是后续的兼容考虑)。

在使用Java的过程中,和C#的语法相比有些还是比较麻烦,比如异常、get set等问题,毕竟Java的发展时间比C#长了很多,很多问题当初设计时没有考虑到,为了向前兼容,不得不保留一定的历史负担(如泛型的处理,java的擦除法实现就是后续的兼容考虑)。不过最近在一个项目中使用groovy grails感觉很是方便,特别groovy和java的集成十分的方便。

下面把groovy涉及的一些基础知识整理一下,供使用参考,groovy本身的文档也很全面,但篇幅太长,如下作为一个简明的参考。

官网 http://groovy.codehaus.org

官网定义:Groovy is an agile dynamic language for the Java Platform with many features that are inspired by languages like Python, Ruby and Smalltalk, making them available to Java developers using a Java-like syntax.

Groovya dynamic language made specifically for the JVM.

Groovy was designed with the JVM in mind

Groovy does not just have access to the existing Java API; its Groovy Development Kit(GDK) actually extends the Java API by adding new methods to the existing Java classes tomake them more Groovy.

Groovy is a standard governed by the Java Community Process (JCP)as Java Specification Request (JSR) 241.

如下涵盖了日常使用中常用的groovy语法,按照这个几次的使用可以很快地熟悉groovy的语法

1. 默认导入的命名空间Automatic Imports

importjava.lang.*;

importjava.util.*;

import java.net.*;

import java.io.*;

import java.math.BigInteger;

import java.math.BigDecimal;

importgroovy.lang.*;

importgroovy.util.*;

使用以上的命名空间下的接口、类等不需要引入

2. 可选分号Optional Semicolons

msg = "Hello"

msg = "Hello";

3. 可选括号Optional Parentheses

println("Hello World!")

println "Hello World!"

//Method Pointer

def pizza = new Pizza()

def deliver = pizza.&deliver()

deliver

4. 可选返回值Optional Return Statements

String getFullName(){

return "${firstName} ${lastName}"

}

//equivalent code

String getFullName(){

"${firstName} ${lastName}"

}

5. 可选类型声明Optional Datatype Declaration (Duck Typing)

s = "hello"

def s1 = "hello"

String s2 = "hello"

printlns.class

println s1.class

println s2.class

6. 可选异常处理Optional Exception Handling

//in Java:

try{

Reader reader = new FileReader("/foo.txt")

}

catch(FileNotFoundException e){

e.printStackTrace()

}

//in Groovy:

def reader = new FileReader("/foo.txt")

7. 操作符重载Operator Overloading

Operator Method

a == b or a != b a.equals(b)

a + b a.plus(b)

a - b a.minus(b)

a * b a.multiply(b)

a / b a.div(b)

a % b a.mod(b)

a++ or ++a a.next()

a- - or - -a a.previous()

a & b a.and(b)

a | b a.or(b)

a[b] a.getAt(b)

a[b] = c a.putAt(b,c)

a << b a.leftShift(b)

a >> b a.rightShift(b)

a < b or a > b or a <= b or a >= b a.compareTo(b)

8. Safe Dereferencing (?)

s = [1, 2]

println s?.size()

s = null

println s?.size()

println person?.address?.phoneNumber //可连用不用检查空

9. 自动装箱Autoboxing

autoboxes everything on the fly

float f = (float) 2.2F

f.class

primitive类型自动装箱

10. 真值Groovy Truth

//true

if(1) // any non-zero value is true

if(-1)

if(!null) // any non-null value is true

if("John") // any non-empty string is true

Map family = [dad:"John", mom:"Jane"]

if(family) // true since the map is populated

String[] sa = new String[1]

if(sa) // true since the array length is greater than 0

StringBuffersb = new StringBuffer()

sb.append("Hi")

if(sb) // true since the StringBuffer is populated

//false

if(0) // zero is false

if(null) // null is false

if("") // empty strings are false

Map family = [:]

if(family) // false since the map is empty

String[] sa = new String[0]

if(sa) // false since the array is zero length

StringBuffersb = new StringBuffer()

if(sb) // false since the StringBuffer is empty

11. Embedded Quotes

def s1 = 'My name is "Jane"'

def s2 = "My name is 'Jane'"

def s3 = "My name is \"Jane\""

单双引号都可以表示字符串

12. Heredocs (Triple Quotes)

s ='''This is

demo'''

println s

三个单、双引号

13. GStrings

def name = "John"

println "Hello ${name}. Today is ${new Date()}"

14. List/Map Shortcuts

def languages = ["Java", "Groovy", "JRuby"]

printlnlanguages.class

def array = ["Java", "Groovy", "JRuby"] as String[]

def set = ["Java", "Groovy", "JRuby"] as Set

def empty = []

printlnempty.size()

languages << "Jython"

println languages[1]

printlnlanguages.getAt(1)

languages.each{println it}

languages.each{lang ->

printlnlang

}

languages.eachWithIndex{lang, i ->

println "${i}: ${lang}"

}

languages.sort()

languages.pop()

languages.findAll{ it.startsWith("G") }

languages.collect{ it += " is cool"}

//Spread Operator (*)

println languages*.toUpperCase()

def family = [dad:"John", mom:"Jane"]

family.get("dad")

printlnfamily.dad

family.each{k,v ->

println "${v} is the ${k}"

}

family.keySet()

import groovy.sql.Sql

//Spread Operator (*)

defparams = []

params<< "jdbc:mysql://localhost:3306/test"

params<< "root"

params<< ""

params<< "com.mysql.jdbc.Driver"

printlnparams

defsql = Sql.newInstance(*params)

//defdb = [url:'jdbc:hsqldb:mem:testDB', user:'sa', password:'', driver:'org.hsqldb.jdbcDriver']

//defsql = Sql.newInstance(db.url, db.user, db.password, db.driver)

defsql = groovy.sql.Sql.newInstance('jdbc:mysql://localhost:3306/tekdays', "root", '', 'com.mysql.jdbc.Driver')

printlnsql.connection.catalog

mysql-connector-java-5.0.7-bin.jar放到groovy安装lib目录下

15. Ranges

def r = 1..3

(1..3).each{println "Bye"}

def today = new Date()

defnextWeek = today + 7

(today..nextWeek).each{println it}

16. Closures and Blocks

def hi = { println "Hi"}

hi()

def hello = { println "Hi ${it}" }

hello("John")

defcalculateTax = { taxRate, amount ->

return amount + (taxRate * amount)

}

println "Total cost: ${calculateTax(0.055, 100)}"

//预绑定

defcalculateTax = { taxRate, amount ->

return amount + (taxRate * amount)

}

def tax = calculateTax.curry(0.1)

[10,20,30].each{

println "Total cost: ${tax(it)}"

}

篇幅有些长,不过有了这些知识对深入的groovy grails的使用很有裨益。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 缓存 Java
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
231 0
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
|
存储 算法 前端开发
JVM - 基础知识
有两种方法,分别为:引用计数法和可达性分析法
132 0
|
存储 Java 编译器
JVM 基础知识
JVM 基础知识
129 0
JVM 基础知识
|
缓存 前端开发 Java
|
Java Shell
基于JVM的动态语言Groovy MetaProgramming 知识集
Metaprogramming 使groovy动态语言的特性发挥的淋漓尽致(Metaprogramming is writing code that has the ability to dynamicallychange its behavior at runtime.
876 0
|
1月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
37 4
|
7天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
5天前
|
Java Linux Windows
JVM内存
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
8 1
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
62 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS