groovy程序设计
元编程和函数式编程风格。
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是该参数的默认名称。
如果传入的参数多于一个,就要通过名字一一列出了
- 点赞
- 收藏
- 关注作者
评论(0)