groovy程序设计

举报
黄生 发表于 2022/12/24 20:49:31 2022/12/24
【摘要】 元编程和函数式编程风格。JAVA8于2014年3月发布,带来了Lambda表达式,支持一定程度的函数式编程。Groovy基于JAVA 1.5及以上版本。groovy的1.0版本发布于2007年。几经波折,可以参考a bit of groovy history. 2012年发布2.0动态语言能够在运行时扩展程序,包括修改类型、行为和对象结构。可以执行在运行时才生成的语句。可以参考 why sc...

元编程和函数式编程风格。
JAVA8于2014年3月发布,带来了Lambda表达式,支持一定程度的函数式编程

Groovy基于JAVA 1.5及以上版本。groovy的1.0版本发布于2007年。几经波折,可以参考a bit of groovy history. 2012年发布2.0

动态语言能够在运行时扩展程序,包括修改类型、行为和对象结构。可以执行在运行时才生成的语句。

可以参考 why scripting languages matter

从测试的角度看,相对于静态类型语言编写代码,使用动态语言需要更加自律。

D:\tool\apache-groovy-binary-2.5.19\groovy-2.5.19\bin>groovy -v
Groovy Version: 2.5.19 JVM: 17.0.4 Vendor: JetBrains s.r.o. OS: Windows 10

D:\tool\apache-groovy-binary-2.5.19\groovy-2.5.19\bin>groovysh
FATAL: java.lang.NoSuchMethodError: 'java.io.OutputStream org.fusesource.jansi.AnsiConsole.wrapOutputStream(java.io.OutputStream)'

所以切换到groovy3,就没问题了

GVM groovy enVironment Manager可以管理多个groovy版本
groovysh开一个终端;groovyconsole开一个图形界面

IDE也提供了支持,比如IntelliJ IDEA对groovy的支持

利用catch(ex) (ex前面没有任何类型)可以捕获摆在我们面前的任何异常。

0.upto(2){print "$it"}

3.times{print "$it "}

0.step(10,2){print "$it "}


println "groovy.bat -v".execute().text

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



def foo(str){
    str?.reverse() //?.安全导航操作符,只有在引用不为null时才调用
}

println foo('evil')
println foo(null)

闭包是匿名方法。
比如,求1到n之间偶数的和,…然后变了,变成求积… 再变,求平方放到数列

这里pickEven是一个高阶函数,因为它的第2个参数是函数/代码块。它在处理中将i发送给函数处理。
这个函数就是闭包Closure
我们调用时使用了匿名代码来定义这个函数,即 {println it}

如果闭包是最后一个实参,可以将
pickEven(10,{println it})
简写为
pickEven(10){println it}

def sum(n){
    total=0
    for (int i=2;i<=n;i+=2){
        total+=i
    }
    total
}

println "sum of even numbers form 1 to 10 is ${sum(10)}"


def pickEven(n, block) {
    for (int i=2;i<=n;i+=2){
        block(i)
    }
}

pickEven(10,{println it})

total=0
pickEven(10){total+=it}
println "sum of even numbers form 1 to 10 is ${total}"

product=1
pickEven(10){product*=it}
println "product of even numbers form 1 to 10 is ${product}"

writer = new FileWriter('o.txt')
writer.write('!') //因为没有close,所以没有flush写入。这是有问题的代码

new FileWriter('o.txt').withWriter { writer ->
    writer.write('?')  //使用groovy添加的withWriter()方法:从闭包返回时,会自动flush并close这个流
}

而与代码块不同,闭包不能单独存在。

it只是向代码块传递一个参数的名称,可以修改,比如改为evenNumber
pickEven(10){evenNumber -> println evenNumber}

我们并未对pickEven函数进行修改,就可以做求和、或求积
这是因为,闭包代理了委托出去的部分实现逻辑

对于单参数的闭包,it是该参数的默认名称。
如果传入的参数多于一个,就要通过名字一一列出了

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。