Groovy 基础学习1
1.基础学习
创建你的第一个 Hello World 程序
?class Example
? static void main(String[] args) {
? ? println('hello world');
?}
当我们运行上面的程序,我们就会得到以下结果:
?hello world
1.什么是Groovy
Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
Groovy是JVM的一个替代语言(替代是指可以用 Groovy在Java平台上进行Java编程),使用方式基本与使用Java代码的方式相同,设计时充分考虑了Java集成,这使Groovy 与 Java代码的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程。
2.基本语法
创建你的第一个 Hello World 程序
?class Example
? static void main(String[] args) {
? ? println('hello world');
?}
当我们运行上面的程序,我们就会得到以下结果:
?hello world
Groovy令牌
令牌可以是一个关键字,一个标识符,常量,字符串文字或符号
?println("hello world");
在上面的代码中,有两个令牌,首先是关键词的println 而接下来就是字符串的"hello world"。
Groovy注释
与Java类似
分号
就像Java编程语言,它需要具有分号在Groovy定义多个语句之间进行区分。
身份标识
标识符用来定义变量,函数或其他用户定义的变量。标识符以字母开头,美元或下划线。他们不能以数字开头。例:
def employeename
?def student1
?def student_name
其中,def是在Grovvy用来定义标识符的关键字
关键字
关键字作为名称建议是在Groovy编程语言中保留的特殊字。T
有:as、assert、break、case、const等等,与java类似。
3.数据类型
内置数据类型:
Groovy提供多种内置数据类型。以下是在Groovy中定义的数据类型的列表
-
byte -这是用来表示字节值。例如2。
-
short -这是用来表示一个短整型。例如10。
-
int -这是用来表示整数。例如1234。
-
long -这是用来表示一个长整型。例如10000090。
-
float -这是用来表示32位浮点数。例如12.34。
-
double -这是用来表示64位浮点数,这些数字是有时可能需要的更长的十进制数表示。例如12.3456565
-
char -这定义了单个字符文字。例如“A”。
-
Boolean -这表示一个布尔值,可以是true或false。
-
String -这些是以字符串的形式表示的文本。例如,“Hello World”的。
类型除了基本类型,还允许以下对象类型(也叫包装类)
-
java.lang.Byte
-
java.lang.Short
-
java.lang.Integer
-
java.lang.Long
-
java.lang.Float
-
java.lang.Double
此外,以下类可用于支持高精度计算:
-
java.math.BigInteger 不可变的任意精度的有符号整数数字 如:30克
-
java.math.BigDecimal 不可变的任意精度的有符号十进制数 如:3.5克
?class Example
? static void main(String[] args) {
? ? ? ? ?int x = 5;
? ? ? ? ?
? ? ? ? ?long y = 100L;
? ? ? ? ?
? ? ? ? ?float a = 10.56f;
? ? ? ? ?
? ? ? ? ?double b = 10.5e40;
? ? ? ? ?
? ? ? ? ?BigInteger bi = 30g;
? ? ? ? ?
? ? ? ? ?BigDecimal bd = 3.5g;
? ? ? ? ?
? ? println(x); ? // 5
? ? ? ? ?println(y); ?// 100
? ? ? ? ?println(a); ?// 10.56
? ? ? ? ?println(b); ?// 1.05E41
? ? ? ? ?println(bi); ?// 30
? ? ? ? ?println(bd); ?// 3.5
?}
List
?def list = []
?def list = [1,2,3]
?def list = ["a","b","c"]
?list.each({
? ? ?item -> log.info(item) ?//循环取出 a b c
? ? ?return ? ? ? ? ? ? ? ? ?//return是退出闭包的意思
?})
Map
?def map = [:] ?//空map
??
?def map = ["a":"val1","b":"val2"]
??
?map.each({
? ? ?a,b ->
? ? ?log.info("key:" + a + " " + "value:" + b)
?})
??
?// key:a value:val1
?// key:b value:val2
字符串
?def str = 'a'
?def str = "a"
??
?def map = ["a":"val1","b":"val2"]
?map.each({
? ? ?a,b ->
? ? ?log.info("key:$a value:$b")
?})
?// key:a value:val1
?// key:b value:val2
??
?//注意,只有使用"" 号时,才可以使用$符号取出值
4.变量
Groovy中的变量可以通过两种方式定义–使用数据类型的本地语法,或者使用def关键字。对于变量定义,必须明确提供类型名称或在替
换中使用“def”。这是Groovy解析器需要的。
Grovvy有基本类型的变量,还允许其他类型的变量,如:数组,结构和类。
声明变量
?class Example
? static void main(String[] args) {
? ? ? ? ?String x = "hello";
? ? ? ? ?
? ? println(x); ? // hello
??
?}
变量命名
变量的名称可以由字母,数字或下划线字符组成。它必须以字母或下划线开头。大写和小写字母是不同的,因为groovy,就像Java是一种区分大小写的编程语言。
?class Example
? static void main(String[] args) {
? ? ? ? ?int x = 5;
? ? ? ? ?
? ? ? ? ?int X = 6;
? ? ? ? ?
? ? ? ? ?def _Name = "ming";
? ? ? ? ?
? ? println(x); ? // 5
? ? ? ? ?println(X); ?// 6
? ? ? ? ?println(_Name); ?// ming
?}
我们可以看出x和X是两个不同的变量,因为区分大小写。
打印变量
可以通过pringln函数打印变量的当前值
5.运算符
运算符是一个符号,通知编译器执行特定的数学或逻辑操作。
Groovy中有以下类型的运算符:
-
算术运算符:+ - * / % ++ --
-
关系运算符 == != < <= > >=
-
逻辑运算符 && || !
-
位运算符 & | ~(按位取反运算符)
-
赋值运算符 += -= *= /= (%)=
范围运算符
Groovy支持范围的概念,并在..符号的帮助下提供范围运算符的符号。例:
?def range = 0..5
这只是定义了一个简单的整数范围,存储到一个局部变量称为范围内的下限为0和上限为5。举例:
?class Example
? static void main(String[] args) {
? ? ? ? ?
? ? ? ? ?def range = 5..10;
? ? ? ? ?
? ? println(range); ? // [5,6,7,8,9,10]
? ? ? ? ?println(range.get(2)); ?// 7
?}
在高版本的groovy中运行结果如下:
?5..10
?7
其中 5..10 等价于[5,6,7,8,9,10],这是Groovy中的一个整数范围(Range)对象,包含从5到10的所有整数。这种写法在Groovy中是非常常见的,它用于标识一个连续的整数序列,通常用于循环或遍历操作中。
6.循环
-
while语句
-
for语句
-
for - in语句(Java中的增强for循环)
举例:
?class Example
? static void main(String[] args) {
? ? ? ? ?
? ? ? ? ?for(int i in 1..5) {
? ? ? ? ? ? ?println(i);
? ? ? ? }
?}
?//结果:
?1
?2
?3
?4
?5
也可用于循环map
?class Example
? static void main(String[] args) {
? ? ? ? ?
? ? ? ? ?def employee = ["Ken":21,"Jhon":25,"Sally":22]
? ? ? ? ?
? ? ? ? ?for(emp in employee) {
? ? ? ? ? ? ?println(emp);
? ? ? ? }
?}
?//结果:
?Ken = 21
?John = 25
?Sally = 22
循环控制语句
-
break语句:用于控制改变循环和switch语句内的控制流
-
continue语句:补充了break语句。它的使用仅限于while和for循环
以上与Java类似...
7.条件语句
-
if语句
-
if/else 语句
-
嵌套if语句
-
Switch语句
-
嵌套switch语句
与java类似...
8.方法
Groovy中的方法是使用返回类型或使用def关键字定义的。方法可以接收任意数量的参数。定义参数时,不必显示定义类型,可以添加修饰符,如 public,private和protected。默认情况下,如果未提供可见性修饰符,则该方法为public。
与Java都类似,但有一点不同:
groovy支持默认参数,例:
?class Example
? static void main(String[] args) {
? ? sum(6); ? ? // 11
? ? ? ? ?sum(6,6) ? ?// 12
? }
? static void sum(int a,int b = 5) {
? ? ?int c = a + b;
? ? ?println(c);
? }
并且Groovy不支持 default的方法。
9.Groovy可选
Groovy是一个“可选”类型的语言,当理解语言的基本原理时,这种区别是一个重要的语言。与Java相比,Java是一种“强”类型的语言,由此编译器知道每个变量的所有类型,并且可以在编译时理解和尊重合同。这意味着方法调用能够在编译时确定。
当在Groovy中编写代码时,开发人员可以灵活地提供类型或不是类型。这可以提供一些简单的实现,并且当正确利用时,可以以强大和动态的方式为您的应用程序提供服务。
在Groovy中,可选的键入是通过def 关键字完成的。
-
def关键字用于定义Groovy中的无类型变量或函数,因为它是一种可选类型的语言。
-
当我们不确定变量或字段的类型时,可以利用def士Groovy在运行时根据分配的值确定类型:
def a = "1"
?def b = 1
?def c = ['a','b','c']
可选的打字在开发期间可以是一个强大的实用程序,但是当代码变得太大或者太复杂的时候,可能导致在后期开发阶段的可维护性问题。
要了解如何使用Groovy中的可选输入,而不让代码库陷入无法维护的混乱,最好在应用程序中采用“鸭式输入”的理念。
如果我们使用鸭式重写上面的代码,它将看起来像是下面给出的。变量的名称的名称比它们代表的类型更多,这使得代码更容易理解。
?class Example
? static void main(String[] args) {
? ? def aint = 100;
? ? ? ? ?
? ? ? ? ?def bfloat = 100.10;
? ? ? ? ?
? ? ? ? ?def cDouble = 100.101;
? ? ? ? ?
? ? ? ? ?def dString = "HelloWorld";
?}
10.Groovy 数字
在Groovy中,数字实际上表示为对象,它们都是类Integer的一个实例。要使对象做某事,我们需要调用在其类中声明的一个方法。
Groovy支持整数和浮点数:
-
整数表示不包含分数的值
-
浮点数是包含小数部分的十进制值
数字方法
-
xxxValue() --- 此方法接受 Number 作为参数,并基于调用的方法返回基本类型
-
compareTo() --- compareTo 方法是使用比较一个数字与另一个数字。如果要比较数字的值,这是有用的。
-
valueOf() --- valueOf 方法返回保存所传递的参数的值的相关 Number 对象。
-
rint() --- 方法 rint 返回值最接近参数的整数。
-
...
11.字符串
与Java类似
索引
class Example {
? ? static void main(String[] args) {
? ? ? ?String sample = "Hello world";
? ? ? ?println(sample[4]); // o
?
? ? ? ?println(sample[-1]); //d
? ? ? ?println(sample[1..2]);//el
? ? ? ?println(sample[4..2]);//oll
? ? ? ?
? ? }
?}
12.Groovy范围
范围是指定值序列的速记。范围由序列中的第一个和最后一个值表示,Range可以是包含或排除。包含范围包括从第一个到最后一个的所有值,而独占范围包括除最后一个之外的所有值,例:
-
1..10 -- 包含范围的示例
-
1 .. <10 -- 独占范围的示例
-
'a'..'x' -- 范围也可以由字符组成
-
10..1 -- 范围也可以降序排列
-
'x'..'a' --范围也可以由字符组成并按降序排列
可用于范围的各种方法
-
contains() -- 检查范围是否包含特定值
-
get() -- 返回此范围中指定位置处的元素
-
getFrom() -- 获得此范围的下限值
-
getTo() -- 获得此范围的下限值
-
isReverse() -- 这是一个反向的范围,反向迭代
-
size() -- 返回此范围的元素数
-
subList() -- 返回此指定的fromIndex(包括)和toIndex(排除)之间的此范围部分的视图
13.Grovvy 列表
列表是用于存储数据项集合的结构。在Groovy中,list保存了一系列对象的引用
常用的列表方法:
-
add() 将新值附加到此列表的末尾
-
contains() 如果此列表包含指定的值,则返回true
-
get() 返回此列表中指定位置的元素
-
isEmpty() 如果此列表不包含元素,则返回true
-
minus() 创建一个由原始元素组成的新列表,而不是集合中指定的元素
-
plus() 创建由原始元素和集合中指定元素组成的新列表
-
pop() 从此列表中删除最后一个项目
-
remove() 删除此列表中指定位置的元素
-
reverse() 创建与原始列表元素相反的新列表
-
size() 获取此列表中的元素数
-
sort() 返回原始列表的排序副本
?def list1 = [100, 101]
?def list2 = [ 99,98,1]
?println list2.plus(list1) //输出结果: [99, 98, 1, 100, 101]
?// list2.plus(list1) 也可以写成 list2 + list1
??
?def list1 = [12, 13]
?def list2 = [11, 2, 33, 12, 13, 16]
?println list2.minus(list1) //输出结果: [11, 2, 33, 16]
?//list2.minus(list1) 也可以写成 list2 - list1
14.Groovy映射
映射,是对象引用的无序集合。
一些方法:
-
containsKey() 此映射是否包含此键
-
get() 查找此Map中的键并返回相应的值。如果此映射中没有键的条目,则返回null
-
keySet() 获取此映射中的一组键
-
put() 将指定的值与此映射中的指定键相关联。如果此映射先前包含此键的映射,则旧值将替换为指定的值
-
size() 返回此映射中的键值映射的数量
-
values() 返回此映射中包含的值的集合视图
15.日期和时间
类Date表示特定的时刻,具有毫秒精度。 Date类有两个构造函数,如下所示。
Date()
?class Example {
? ? static void main(String[] args) {
? ? ? ?Date date = new Date();
? ? ? ?
? ? ? ?// display time and date using toString()
? ? ? ?System.out.println(date.toString()); ? // Thu Dec 10 21:31:15 GST 2015
? ? }
?}
Date(长毫秒)
参数:毫秒
返回值:分配一个Date对象并将其初始化以表示自标准基准时间(称为“该历元”,即1970年1月1日,00:00:00 GMT)起指定的毫秒数。
?class Example {
? ? static void main(String[] args) {
? ? ? ?Date date = new Date(100);
? ? ? ?
? ? ? ?// display time and date using toString()
? ? ? ?System.out.println(date.toString()); ? ?//Thu Jan 01 04:00:00 GST 1970
? ? }
?}
常用方法:
-
after() 测试此日期是否在指定日期之后
-
equals() 比较两个日期的相等性。当且仅当参数不为null时,结果为true,并且是表示与该对象时间相同的时间点(毫秒)的Date对象
-
compareTo() 比较两人日期的顺序
-
toString() 将此Date对象转换为字符串
-
before() 测试此日期是否在指定日期之前
-
getTime() 返回自此Date对象表示的1970年1月1日,00:00:00 GMT以来的毫秒数。
-
setTime() 设置此Date对象以表示一个时间点,即1970年1月1日00:00:00 GMT之后的时间毫秒。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!