groovy基本语法学习

文中项目git地址

本人使用的是AS开发,所以环境搭建很简单
Mac下执行:brew install groovy

项目下:
build.gradle in project add:

classpath 'org.codehaus.groovy:gradle-groovy-android-plugin:0.3.6'

build.gradle in app add:

compile 'org.codehaus.groovy:groovy:2.4.0:grooid'

下面是学习中写的代码:

基本语法

package com.example

public class test1 {
    public static void main(String[] args) {

//        for (int i =0 ;i < 5;i++) {   //for循环
//            System.out.print("中国" + i)
//        }
//        System.out.print("over")
//        //中国0中国1中国2中国3中国4over

//        for (i in 0..10) {            //for 循环
//            print(i)
//        } //012345678910

//        0.upto(2) {                   //从n(0)到m(2)
//            print("$it") // it 是闭包的默认参数
//        }   // 012v

//        3.times {                   //从0到m(2)
//            print("$it") // it 是闭包的默认参数
//        } //012

//        0.step(10,2) {                //从0到10 ,每次循环步长为2
//            print("$it")
//        } //02468

//        println "pwd".execute().text  //命令输出


//        def fooPattern = /.*foo.*/
//        assert fooPattern == '.*foo.*'
//        def foo = /"china"/ // 可以在斜线表达式中,直接使用引号
//        println foo // 结果是“china”


//        println foo("evil")
//        println foo(null)

//        try {
//            openFile("null")
//        } catch (ex) {
//            println ex
//        }

//        Car car = new Car('2017')
//        println  "YEAR : ${car.year}"  //打印时的$可以不加括号
//        println("MILES : $car.miles")

//        def name1 = "china1"  //返回为多结果时可以多赋值,以 () 分别赋值 ,这里可以作为交换变量使用
//        def name2 = "china2"
//        println("$name1 , $name2")
//        (name1,name2) = [name2,name1]
//        println "$name1 , $name2"


    }
//    def static foo(str) {  //?. 判空
//        str?.reverse()
//    }

//    def static openFile(fileName) { //异常处理默认throw了
//        new FileInputStream(fileName)
//    }


//    static class Car {
//       def miles = 1
//       def year
//
////        Car(thisYear){ //可以去掉自己的构造方法,使用灵活初始化  Car car = new Car(year:'2017')
////            year = thisYear
////        }
//    }
} 

注解

package com.example
//计算器 注解
public class test3 {
    @Newify(ComplexNumber) //取代new的一种方式,可以直接使用 ComplexNumber(real: 1,imaginary: 1)
    public static void main(String[] args) {

       def c1 = new ComplexNumber(real: 1,imaginary: 2)
       def c2 = new ComplexNumber(real: 4,imaginary: 1)
//        def c3 = ComplexNumber.instance
        println c1 + c2  //plus 对应 + minus 对应 - multiply 对应 *   div 对应 /
        println c1 - c2
        println c1 * c2
        println c1 / c2

//        @Delegate  //委托类操作 ,方便好用
//        @Immutable //不可变的 同java的final  可以做线程安全使用
//        @Lazy  //懒加载,类似单例模式中的懒加载,只有用到时才进行创建

        println ComplexNumber.new(real: 1,imaginary: 1)
    }

//    @Canonical(excludes = "") //调用println 回去找toString方法,使用此注解可以不用自己写toString方法了
//    @Singleton(lazy = true) //单例模式注解 简化使用方式
    static class ComplexNumber {
        def real,imaginary
        def plus(other) {
            new ComplexNumber(real :real+other.real, imaginary: imaginary+other.imaginary )
        }

        def minus(o) {
            new ComplexNumber(real: 99,imaginary: 99)
        }
        def multiply(o) {
            new ComplexNumber(real: 999,imaginary: 999)
        }

        def div(o) {
            new ComplexNumber(real: 9999,imaginary: 9999)
        }

        String toString() {  //默认调用toString方法
            "$real ${imaginary >0?"+":''} ${imaginary}i"
        }
    }

}
package com.example
//闭包是一个函数   匿名函数指针 ,将部分实现逻辑委托出去
public class test4 {
    public static void main(String[] args) {
//        pickEvent(10) {
                //当闭包在最后时可以直接放到括号外边代码块中
//           str, param -> println param
//            println it
//        }

        //curry 使用
//        def multiply = { x, y -> return x * y }  // closure
//        def triple = multiply.curry(3)           // triple = { y -> return 3 * y }
//        def quadruple = multiply.curry(4)        // quadruple = { y -> return 4 * y }
//        def p = triple.call(4)                   // explicit call
//        def q = quadruple(5)                     // implicit call
//        println "p: ${p}"                        // p is 12
//        println "q: ${q}"                        // q is 20

        //尾递归的方式 ,尾递归不会一直保存栈信息,只需要覆盖即可
        //如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。
        // 当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。
        // 尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。
        Closure factorial
        factorial = {
            int number , BigInteger theFac -> number ==1?theFac : factorial.trampoline(number -1, number * theFac)
        }.trampoline()

        println "fac 5 ${factorial(5,1)}"
        println "fac 5000 ${factorial(5000,1).bitCount()}"

    }

    static def pickEvent(n,Closure block) {
        if (!block) return
        println block.maximumNumberOfParameters
        println block.parameterTypes

        2.step(n, 2) {
            def cu = block.curry(3)//传入的参数为两个,使用curry之后去掉了一个
            cu("china: $it")
        }
    }


}

接口实现

package com.example
// 接口实现: Groovy 能把一个映射或者代码块转化为接口
public class test5 {
    public static void main(String[] args) {
        def mListener = [
                do1: { println("$it") },
                do2: { println(it + "dddddddd") },
                //若仅仅实现部分方法,调用其他方法时会报空指针,此处不实现do3,报错如下
                //Exception in thread "main" java.lang.UnsupportedOperationException,at com.sun.proxy.$Proxy0.do3(Unknown Source)
//                do3: { java.lang.Object[] pars -> println("$pars") }
        ] as MListener
        mListener.do1("do1")
        mListener.do2("do2")
        mListener.do3("do3", "333333")

        //或者实现一个代码块,此时不论调用do1 ,或者do2 都会调用此代码块
//        def mListener1 = {
//           Object[] params -> println("$params")
//        } as MListener
//        mListener1.do1("do1")
//        mListener1.do2("do2" , "aaaaaaa")
    }

    // lambda 表达式 接口
    static interface MListener {
        void do1(String str)

        void do2(String str)

        void do3(String str, String str2)
    }

}

集合类

package com.example

//集合类
public class test6{
    public static void main(String[] args) {
        def lst = [1,2,3,4,5,6]
        def sublst = lst[2..3]   //新的一个ArrayList
        println lst.dump()
        println sublst.dump()

        sublst[0] = -9999
        println lst.dump()
        println sublst.dump()
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,705评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,551评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,227评论 25 707
  • 这几天学习 AppWidget ,很简单的组件却花费了不少功夫,今天对 PendingIntent 的用法做了一些...
    s0me0ne阅读 1,398评论 0 1
  • 在微信看到“竹子”的信息:灵岩寺重建20周年及书画院开幕等,招募义工时,第一时间报了名。 后来,我正学习的“七碗茶...
    梁瑞芳安阅读 456评论 0 0