Groovy

本是古典 何须时尚 2024-02-19 14:30 123阅读 0赞

Groovy

    • 1.Groovy基本类型
      • 01.所有类型都是包装类
      • 02.类型推断
    • 2.GString
    • 3.字符串操作
      • 字符串扩充:
      • 获取:
      • 字符串的加减操作
      • 字符串转换其他类型
    • 4.for循环扩充
    • 5.闭包
      • 闭包的基本定义和使用
      • 闭包传递参数
      • 闭包常见的使用场景
        • upTo方法
        • times方法
        • each方法
        • find方法
        • findAll方法
        • any方法
        • every方法
        • collect方法
    • 6.闭包中的 this,owner,delegate对象
    • 7.闭包的委托策略
    • 8.数据结构
      • 列表
        • 定义一个列表:
        • 列表排序
        • 列表查找
      • 映射(Map)
        • 定义Map
        • 获取值
      • 修改值
      • 遍历
      • 分组
      • 范围

1.Groovy基本类型

01.所有类型都是包装类

在groovy中只有包装类型,没有基本类型。比如int就是Integer类型,double就是Double类型。

  1. package variable
  2. int i = 10
  3. println(i.class)
  4. double d = 10
  5. println(d.class)
  6. char c = 'c'
  7. println(c.class)

输出结果为:

  1. class java.lang.Integer
  2. class java.lang.Double
  3. class java.lang.Character

02.类型推断

可以用def关键字定义一个变量,编译器会根据赋值情况推断出变量是属于哪种类型

  1. package variable
  2. def i = 11
  3. println i.class
  4. i = '12'
  5. println i.class

控制台打印结果为:

  1. class java.lang.Integer
  2. class java.lang.String

2.GString

在groovy中,还可以用单引号和三引号定义字符串。其中,三引号定义的字符串会保留字符串定义时的格式(如换行等)

  1. def s = '''
  2. one
  3. two
  4. three
  5. '''

控制台输出:

  1. one
  2. two
  3. three

字符串中有扩展表达式,就是GString:

  1. def name = "Tom"
  2. // 这里只能用双引号
  3. def sayHi = "hi ${name}"
  4. println sayHi
  5. println sayHi.class

控制台打印:

  1. hi Tom
  2. class org.codehaus.groovy.runtime.GStringImpl

在${}可以使用表达式。

3.字符串操作

字符串扩充:

主要方法:

  1. center(n): 接收一个参数,从中间向两边扩充字符串,扩充的字符串是空格
  2. center(n, c): 接收两个参数,从中间向两边扩充字符串,扩充的字符串是传入的字符串c
  3. padLeft(n): 接收一个参数,从左边扩充字符串,扩充的字符串是空格
  4. padLeft(n, c): 接收一个参数,从左边扩充字符串,扩充的字符串是传入的字符串c
  5. padRight(n): 接收一个参数,从右边扩充字符串,扩充的字符串是空格
  6. padRight(n, c): 接收一个参数,从右边扩充字符串,扩充的字符串是字符串c

演示代码:

  1. def s = 'groovy'
  2. println s.center(8, '@')
  3. println s.padLeft(8)
  4. println s.padRight(8, '@')

控制台打印:

  1. @groovy@
  2. groovy
  3. groovy@@

获取:

字符串的获取可以使用java中的charAt方法,groovy中也可以用中括号来获取对应位置的字符s[2],也可以获取对应区间的字符s[0…3]
演示代码:

  1. def s = 'groovy'
  2. println s.charAt(1)
  3. println s[2]
  4. println s[0..3]

控制台打印:

  1. r
  2. o
  3. groo

字符串的加减操作

字符串中的加(+)同java中的加是一样的,而减(如A-B)就是把字符串A中包含的字符串B删除

  1. > def s = 'groovy'
  2. > def h = 'hello '
  3. >
  4. > def hs = 'hello groovy'
  5. >
  6. > println h + s
  7. > println hs - h
  8. hello groovy
  9. groovy

-操作符对应的方法是:

  1. minus(s):从一个字符串中减去字符串s

代码演示:

  1. > def s = 'groovy'
  2. > def h = 'hello '
  3. >
  4. > def hs = 'hello groovy'
  5. > println hs.minus(h)
  6. groovy

字符串转换其他类型

可以通过字符串.xxx来将字符串转换成其他类型的对象:

  1. > def s = '1'
  2. > println s.toInteger().class
  3. > println s.toLong().class
  4. class java.lang.Integer
  5. class java.lang.Long

4.for循环扩充

对集合循环:

  1. > // 对集合循环
  2. > for (i in [1, 23, 5, '12']) {
  3. > println i
  4. > }
  5. 1
  6. 23
  7. 5
  8. 12

对map循环:

  1. > // 对集合循环
  2. > for (i in [a: 'a', b: 'ab', c: 1]) {
  3. > println i.key + " : " + i.value
  4. > }
  5. a : a
  6. b : ab
  7. c : 1

对范围循环:

  1. > // 对范围循环
  2. > for (i in 2..10) {
  3. > print i + " "
  4. > }
  5. 2 3 4 5 6 7 8 9 10

5.闭包

闭包是一个代码块,类似于方法。

闭包的基本定义和使用

定义一个简单的闭包和对闭包的调用:

  1. > // 定义一个简单的闭包
  2. > def closure= {
  3. > println 'hello groovy'
  4. > }
  5. >
  6. > // 闭包的调用方式一
  7. > closuer()
  8. > // 闭包的调用方式二
  9. > closure.call()
  10. hello groovy
  11. hello groovy

闭包传递参数

  • 闭包的默认参数 it

    // 闭包有一个默认参数 it
    def closure= {

    1. println "hello ${it}"

    }

    closure.call(“groovy”)
    hello groovy

  • 自定义参数
    下面闭包的有两个参数,分别是 name 和age,参数可以指定具体的类型也可以不指定

    def clou
    ser = {

    1. String name, age ->
    2. println "我的名字是${name}, 我的年龄是 ${age}"

    }

    closure(“zhangsan”, 18)
    我的名字是zhangsan, 我的年龄是 18

  • 闭包的返回值
    闭包中一定有返回值(返回值可以不写return)

    def closure= {

    1. String name, age ->
    2. println "我的名字是${name}, 我的年龄是 ${age}"
    3. // 返回值是Hello
    4. return "Hello"

    }

    def res = closure(“zhangsan”, 18)

    println res
    我的名字是zhangsan, 我的年龄是 18
    Hello

也可以不写return:

  1. > def closure= {
  2. > "Hello"
  3. > }
  4. >
  5. > def res = closure()
  6. > println res
  7. Hello

没有显示返回,就是返回null

闭包常见的使用场景

upTo方法

从一个值A到另一个值的B的循环(A<B)

  1. def n = 3
  2. def add(int param) {
  3. def result = 0
  4. 1.upto(param, {
  5. x -> result += x
  6. })
  7. result
  8. }
  9. println add(n)

上面程序完成了从1到3的累加。
控制台打印结果:

  1. 6

除了upTo,还有一个相同的方法downTo,是一个大数到一个小数的循环。

times方法

不同于upTo和downTo是从一个数A到一个数B的遍历,times方法只从0开始遍历到指定的数:

  1. def n = 3
  2. n.times {
  3. x -> print x
  4. }

上面程序实现了从0到3的遍历.
控制台打印结果为:

  1. 012
each方法

each方法可以完成对字符串的遍历操作

  1. def s = 'hello world'
  2. s.each {
  3. // 向右扩充为两位 相当于加个空格
  4. c -> print c.padRight(2)
  5. }

控制台输出:

  1. h e l l o w o r l d
find方法

find方法可以完成遍历并返回第一个满足的结果:

  1. def s = 'hello 2 world 4'
  2. def num = s.find {
  3. x -> x.isNumber()
  4. }
  5. print num

控制台输出:

  1. 2
findAll方法

与find方法类似,不同的是,findAll方法会返回所满足的结果:

  1. def s = 'abc123def456'
  2. def all = s.findAll {
  3. //判断遍历的值是否是数值,如果是就转换成Integer,再和3比较
  4. x -> x.isNumber() && x.toInteger() >= 3
  5. }
  6. println all

控制台输出:

  1. [3, 4, 5, 6]
any方法

判断是否有一个满足条件

  1. def s = 'abc123def456'
  2. def res = s.any {
  3. // it是闭包的默认参数
  4. it.isNumber()
  5. }
  6. println res

控制台打印:

  1. true
every方法

every方法用于判断遍历的数据是否全部都满足条件

  1. def s = 'abc123def456'
  2. def res = s.every {
  3. it.isNumber()
  4. }
  5. println res

控制台打印:

  1. false
collect方法

collect方法是用于对遍历的每一项数据作操作的,返回操作后的每一项数据的集合:

  1. def s = 'abc123def456'
  2. def res = s.collect {
  3. it.toUpperCase()
  4. }
  5. println res

控制台打印:

  1. [A, B, C, 1, 2, 3, D, E, F, 4, 5, 6]

6.闭包中的 this,owner,delegate对象

在闭包中有三个内置对象,分别是this,owner和delegate,它们三个的作用分别是:

  1. thisthis向的是当前闭包所属的类或对象
  2. owner: owner指向当前闭包所属的类或对象,如果当前闭包是定义在另一个闭包内,那么owner指向当前闭包所属的闭包
  3. delegate: delegateowner一致,只有手动修改delegate的值,delegate才会改变为与owner不一致
  4. def closure = {
  5. println "this" + this
  6. println "owner" + owner
  7. println "delegate" + delegate
  8. }
  9. closure.call()

控制台:

  1. this : ideaGroovyConsole@3eb25e1a
  2. owner : ideaGroovyConsole@3eb25e1a
  3. delegate : ideaGroovyConsole@3eb25e1a

闭包内定义闭包:

  1. def c = {
  2. def closure = {
  3. println "this : " + this
  4. println "owner : " + owner
  5. println "delegate : " + delegate
  6. }
  7. // 调用内部闭包
  8. closure.call()
  9. }
  10. c.call()

控制台输出:

  1. this : ideaGroovyConsole@3bf7ca37
  2. owner : ideaGroovyConsole$_run_closure1@4d1c00d0
  3. delegate : ideaGroovyConsole$_run_closure1@4d1c00d0

只有delegate才能修改

7.闭包的委托策略

  1. class Dog {
  2. String name
  3. def eat = {
  4. "${name} is eating"
  5. }
  6. void life() {
  7. print eat.call()
  8. }
  9. }
  10. class Cat {
  11. String name
  12. }
  13. Dog dog = new Dog(name: "dog")
  14. Cat cat = new Cat(name: "cat")
  15. // dog.life() 这里执行的话还没有修改委托策略,在闭包中获取的name属性还是dog中的name属性
  16. dog.eat.delegate = cat // 修改eat闭包的委派给cat
  17. // 这里修改委派策略为使用 delegate 也可以使用owner等
  18. dog.eat.resolveStrategy = Closure.DELEGATE_ONLY
  19. dog.life()

8.数据结构

列表

定义一个列表:
  1. def list = [1,2,3, "aa"] // 这样就定义了一个列表了

上面定义出来的列表使用的是java中的ArrayList,这种定义方式类似于java中定义数组的方式。如果要在groovy中定义数组的话要使用如下方式:

  1. def arr1 = [1, 2, 3, 'a', "ab"] as Object[]
  2. int[] arr2 = [1,2,3,4]
列表排序

直接使用列表对象的sort方法对列表排序:

  1. def list = [1,-1,2,-2,3,-4]
  2. list.sort()
  3. println list

也可以自定义排序规则:

  1. def list = [1,-1,2,-2,3,-4]
  2. list.sort({
  3. x, y ->
  4. y - x
  5. })
  6. println list

通过传入一个闭包,完成自定义排序。

列表查找
  1. def list = ["1", '2', '3', 'a', 'b', 'c']
  2. println list.find({
  3. x -> x.isNumber() })
  4. println list.findAll {
  5. x -> x.isNumber() }
  6. println list.any {
  7. x -> x.isNumber() }
  8. println list.every {
  9. x -> x.isNumber() }

映射(Map)

定义Map

可以使用java中定义列表的方式,而groovy定义方式如下:

  1. def map = [name: "zhangsan", age: "18", country: "China"]

groovy中的映射使用的是:LinkedHashMap。

获取值

获取值可以通过以下三种方法获取值:

  1. def map = [name: "zhangsan", age: "18", country: "China"]
  2. println map.get("name")
  3. println map.name
  4. println map['name']

修改值

修改值的方式有如下三种:

  1. def map = [name: "zhangsan", age: "18", country: "China"]
  2. // 如果map中不存在这个属性,就会添加,存在就修改
  3. map.addresss = 'sz'
  4. map.age = 19
  5. map['name'] = 'lisi'

遍历

  1. each { target -> } :一个参数
  2. eachWithIndex {target, index -> } : 两个参数
  3. map.eachWithIndex {key, value, index -> } :三个参数

分组

  1. def map = [p: [name: "zhangsan", age: 17, country: "China"],q: [name: "zhangsan", age: 18, country: "China"]]
  2. def res = map.groupBy {
  3. x ->
  4. println x.value.age
  5. return x.value.age < 18 ? '未成年' : '成年'
  6. }
  7. println res

控制台输出:

  1. [未成年:[p:[name:zhangsan, age:17, country:China]], 成年:[q:[name:zhangsan, age:18, country:China]]]

范围

定义:

  1. def range = 1..10

使用A…B来表示一个边界A到边界B的范围,可以通过[]获取对应 索引的值,也可以通过from和to属性获取边界。

  1. def range = 1..10
  2. def r2 = range[2]
  3. def from = range.from
  4. def to = range.to

A…B,表示的区间是[A,B],即A和B都能取到。
如果要表示不包含的话可以是:

  1. def 1..<10

<括号只能写在右边。

发表评论

表情:
评论列表 (有 0 条评论,123人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Groovy

    Groovy 是 用于Java [虚拟机][Link 1]的一种敏捷的 [动态语言][Link 2],它是一种成熟的 [面向对象][Link 3]编程语言,既可以用于面向对象编

    相关 Groovy入门

    目录 一. Groovy是啥? 二. 配置Groovy 三. 体验Groovy自带的编辑器 四. 使用Intellij IDEA创建Groovy工程 五. Groov

    相关 Groovy快速入门-1-Groovy简介

           补上一个系列,叫Groovy快速入门,如果你学习过Java并且有一定的水平,其实Groovy项目中,你完全可以百分百Java代码实现,这没有毛病,如果你学习的是P