Grovvy初识

1.Groovy和Java对比

Groovy的松散的语法允许省略分号和修饰符
除非另行指定,Grovvy的所有内容都为public
Grovvy允许定义简单脚本,同时无需定义正规的class对象
Grovvy在普通的常用java对象上增加了一些独特的方法和快捷方式,使得他们更容易使用
Grovvy语法还允许省略变量类型
关于闭包:可以将闭包想象成为一个代码块,可以现在定义,以后再执行。可以使用这些强大的构造做许多漂亮的事情,不过最著名的是简化迭代。使用Grovvy之后,就有可能也不再需要编写Iterator实例了。
动态的mGroovy:从技术山讲,Grovvy可能是您最近通水的类型最松散的动态语言之一。从这个角度讲,Groovy有java的区别很大,java语言是一种固定的类型语言。在Groovy中类型是可选的。所以不必输入String myStr="Hello",来声明String变量。可以直接使用def进行不指定类型定义,类似于java中的var.
与java交互:用Grovvy编写的任何内容都可以编译成标准的java泪文件并在java代码中重用。类似地,用标准的java代码编写的内容也是可以在Grovvy中重用。

2.用实例演示Java和Grovvy的区别

用java编写的Hello World
public  class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World");
}
}
编译和运行Java示例
编译 c:>javac HelloWorld.java
执行 c:>java HelloWorld
用Grovvy编写的Hello World 
Grovvy支持松散的java语法,例如,不需要为打印Hello World这样的简单操作定义类
而且,Grovvy使日常的编码活动变得更容易。例如,Grovvy允许驶入peinrln,而无须输入System.out.println。。当输入println时,Grovvy会非常聪明的知道您的System.out
所以用Grovvy编写Hello World的程序就上如下:
println "Hello World"

请注意,在这段代码周围没有类结构,而且也没有方法结构!我还使用 println 代替了 System.out.println

运行Grovvy示例:
假设文件为

/home/amosli/developsoft/language/groovy/test/Hello.groovy

 

如果已经设置了Grovvy的环境变量,那么只需输入:

更快捷的方式:

如果有环境变量就变成了:

 

这会有相同的结果,而且甚至无须定义任何文件。

3Grovvy是没有类型的java代码

类型定义:

为什么要有类型定义:在java中,如果要声明一个String变量,则必须输入:

String value="Hello world";

 

但是,如果仔细想想,就会看出,等号右侧的字符已经表明 value 的类型是 String。所以,Groovy 允许省略 value 前面的 String 类型变量,并用 def 代替。

 def value="hello world"

 

实际上,Grovvy会根据对象的值来判断他的类型。

运行程序!

将HelloWorld.grovvy文件中的代码编辑成下面这样

 

4.通过Grovvy进行循环

方式1:

这里可以定义i为int或者def,或者不定义其类型

方式2:

使用in进行循环,其中..表示“到”,0..5表示0到5.类似于0<=5;这里循环6次。

可以使用0..<5进行限定。类似于0<5循环5次。

5.Grovvy中的集合

1)Grovvy中的list

注意:assert命令用来证明范围是java.util.List的实例,接着运行这个代码,。证实该范围是类型List的集合。

Grovvy的语法:

coll看起来很像一个java语言中的数组,实际上他是一个Collection。要在普通的java代码中得到集合的相同实例,必须执行以下操作。

在java黛娜中,必须使用add()向ArrayList实例添加项。

而Grovvy中则提供了三种方法:

 

查找元素:

Grovvy中的特殊方法:

Grovvy中的特殊方法:

 

join()和count()只是在任何项List都可以调用的众多方法中的两个,分布操作符是个提别方便的工具,使用这个工具不要再集合上迭代,就能够调用集合每个项上的方法。

假设有一个String列表,现在想将列表中的项目全部变成大写,可以编写以下代码:

 

assert ["JAVA", "GROOVY"] ==

["Java", "Groovy"]*.toUpperCase()

注意*.标记。对于以上列表中的每个值,都会调用toUpperCase().生成的集合中每个String实例都是大写的。

 

 

2)Grovvy中的Map

java语言中的映射是名称-值对的集合。所以,要用java代码创建典型的映射,必须像如下这样:

Grovvy使得处理映射的操作像处理列表一样简单,例如,可以用Grovvy将上面的java映射写成:

注意:Grovvy映射中的键不必恃String.在这个示例中,name看起来像一个变量,但是在幕后,Grovvy会将它变成String.

验证hash格式:

assert   hash.getClass()==java.util.LinkedHashMap

 

Grovvy中Hash的Set/Get

注意:在使用[]语法从映射获取项时,必须将项作为String引用。

 

6Grovvy中的闭包

java的Iterator实例,用它在集合上迭代,就像下面这样。

注意,each直接在acoll实例内调用,而acoll实例的类型是ArrayList.在each调用之后,引入了一种新的语法{,代码}。由{}包围起来的代码块就是闭包。

闭包中的it变量是一个关键字,指向被调用的外部集合的每个值-他是默认值,可以用传递给闭包的参数覆盖他。下面的代码执行同样的操作,但使用自己的项变量:

在这个示例中,用value代替了Grovvy的默认it.

 

请注意,闭包还允许使用多个参数,在上面的实例中,包含两个参数(key和value)

凡是集合或一系列的内容,都可以使用下面这样的代码进行迭代。

 

这段代码是名为excite的闭包,这个闭包接受一个参数(名为word)返回的String是word变量加两个感叹号。请注意String实例中替换的用法。在String中使用${value}语法将告诉Grovvy替换String中的某个变量的值。可以将这个语法当成return word+"!!"的快捷方式。

输出this is Grovvy

 

7Groovy中的类

新建一个类song

 

 

 

Groovy 自动提供一个构造函数,构造函数接受一个名称-值对的映射,这些名称-值对与类的属性相对应。这是 Groovy 的一项开箱即用的功能 — 用于类中定义的任何属性,Groovy 允许将存储了大量值的映射传给构造函数。映射的这种用法很有意义,例如,您不用初始化对象的每个属性。


 

也可以添加下面这样的代码:

也可以添加像下面这样直接操纵类的属性:

在Song类中,添加以下代码:

 

8 Grovvy中的单元测试

在Intellij中只需要加入@Test注解就可以使用JUnit测试

加个?可以防止空指针的错误:

9.扩展、

 

如果需要用Groovy做web 项目的话可以去了解一下Grails框架。

转载于:https://www.cnblogs.com/dream-to-pku/p/5445705.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C和C++混合编程(__cplusplus使用)

第一种理解 比如说你用C开发了一个DLL库&#xff0c;为了能够让C语言也能够调用你的DLL输出(Export)的函数&#xff0c;你需要用extern "C"来强制编译器不要修改你的 函数名。 通常&#xff0c;在C语言的头文件中经常可以看到类似下面这种形式的代码&#xff1a; …

$.ajax 同步一不,ajax 同步不生效

可以用的生效代码注意 boolean 的位置var baseUrl ${pageContext.request.contextPath };function formcheck(){var flag false;var customerNameaa;var countryaa;var citybeijing;$.ajax({type: POST,url:baseUrl "/exports/credit/findBuyersBySerach",data:{&…

iOS工程中创建pch文件

1.新建pch类文件 2.在工程配置中,Build Setting 下搜索"pre"寻找Apple LLVM6.1 - Language下的 Preflx Header 3.点开Preflx Header 把左边pch类拖拽进去 4.把/"工程名"/....前边的内容全部换为$(SRCROOT) (具体替换内容看报错自己灵活运用)转载于:https:/…

批处理中setlocal enabledelayedexpansion的作用详细整理

设置本地为延迟扩展。其实也就是&#xff1a;延迟变量&#xff0c;全称延迟环境变量扩展, 想进阶&#xff0c;变量延迟是必过的一关&#xff01;所以这一部分希望你能认真看。 为了更好的说明问题&#xff0c;我们先引入一个例子。 例1: echo off set a4 set a5&echo…

一个服务器多个网站多个域名,多个域名一个服务器吗

多个域名一个服务器吗 内容精选换一换PAS(Primary Application Server)&#xff1a;主应用服务器。AAS(Additional Application Server)&#xff1a;扩展应用服务器。ASCS(ABAP Central Services)&#xff1a;SAP应用核心服务&#xff0c;是SAP应用的一个核心控件&#xff0c;包…

iframe 子父窗口互掉 js

一、父窗口调用iframe子窗口方法 1、HTML语法&#xff1a;<iframe name"myFrame" src"child.html"></iframe> 2、父窗口调用子窗口&#xff1a;myFrame.window.functionName(); 3、子窗品调用父窗口&#xff1a;parent.functionName(); 简单地…

yii2 ajax分页,Yii框架分页技术实例分析

本文实例讲述了Yii框架分页技术。分享给大家供大家参考&#xff0c;具体如下&#xff1a;直接上代码&#xff1a;1.首先写控制器层先引用pagination类use yii\data\Pagination;写自己的方法:function actionFenye(){$data Field::find(); //Field为model层,在控制器刚开始use了…

Spring源码解析——如何阅读源码

阅读目录 下面看一下如何使用jar包以及源码的source包  下面给出一个简单的spring样例  如何阅读源码最近没什么实质性的工作&#xff0c;正好有点时间&#xff0c;就想学学别人的代码。也看过一点源码&#xff0c;算是有了点阅读的经验&#xff0c;于是下定决心看下spring…

c++多线程编程

一直对多线程编程这一块很陌生&#xff0c;决定花一点时间整理一下。 os:ubuntu 10.04 c 1.最基础&#xff0c;进程同时创建5个线程&#xff0c;各自调用同一个函数 [html] view plaincopy #include <iostream> #include <pthread.h> //多线程相关操作头文件&am…

ajax当页post请求,tag落地页--通过ajax-post请求数据

查询所有tag及其对应跳转链接$tags get_tags(array(get>all));$output . ;if($tags) {foreach ($tags as $tag):$output . . $tag->name .;endforeach;} else {_e(No tags created., text-domain);}$output . ;echo $output;交互tag查询image场景如下&#xff0c;通过页…

GIT的PUSH指令

### GIT的PUSH指令 $ git push <远程主机名> <本地分支名>:<远程分支名> * git push命令用于将本地分支的更新&#xff0c;推送到远程主机。 * 如果省略远程分支名&#xff0c;则表示将本地分支推送到与之对应的远程分支&#xff08;通常两者同名&#xff…

Android 编程下 Touch 事件的分发和消费机制

Android 中与 Touch 事件相关的方法包括&#xff1a;dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev)&#xff1b;能够响应这些方法的控件包括&#xff1a;ViewGroup、View、Activity。方法与控件的对应关系如下表所…

ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传

//上传视频uploadVideo:function(){let _this this;let list [camera, album];wx.showActionSheet({itemList: [拍摄视频,从相册选择视频,从视频库选择视频],success: function (res) {if(res.tapIndex0 || res.tapIndex1){wx.chooseVideo({sourceType:[list[res.tapIndex]],…

如何手工抓取dump文件及分析

在生产环境下进行故障诊断时&#xff0c;为了不终止正在运行的服务或应用程序&#xff0c;有两种方式可以对正在运行的服务或应用程序的进程进行分析和调试。 首先一种比较直观简洁的方式就是用WinDbg等调试器直接attach到需要调试的进程&#xff0c;调试完毕之后再detach即可。…

Java 类加载机制详解

2019独角兽企业重金招聘Python工程师标准>>> 一、类加载器 类加载器&#xff08;ClassLoader&#xff09;&#xff0c;顾名思义&#xff0c;即加载类的东西。在我们使用一个类之前&#xff0c;JVM需要先将该类的字节码文件&#xff08;.class文件&#xff09;从磁盘…

JAVA vo pojo javabean dto区别

JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean&#xff0c;类必须是具体的和公共的&#xff0c;并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知&#xff0c;属性名称符合这种模式&#xff0c;其他Java 类可…

编写的windows程序,崩溃时产生crash dump文件的办法

一、引言 dump文件是C程序发生异常时&#xff0c;保存当时程序运行状态的文件&#xff0c;是调试异常程序重要的方法&#xff0c;所以程序崩溃时&#xff0c;除了日志文件&#xff0c;dump文件便成了我们查找错误的最后一根救命的稻草。windows程序产生dump文件和linux程序产生…

Nginx+PHP实时生成不同尺寸图片

原来图片服务器采用Windows .net架构&#xff0c;鉴于需求需要生成各种尺寸图片。流程说明:用户从Nginx请求对应的图片,判断是否存在_200x300的对应参数&#xff0c;如果没有就直接请求到对应目录的原图&#xff0c;否则继续判断是否在本地已经生成了对应的缓存图片&#xff0c…

JavaScript设计模式 Item 2 -- 接口的实现

1、接口概述 1。什么是接口&#xff1f; 接口是提供了一种用以说明一个对象应该具有哪些方法的手段。尽管它可以表明这些方法的语义&#xff0c;但它并不规定这些方法应该如何实现。 2. 接口之利 促进代码的重用。 接口可以告诉程序员一个类实现了哪些方法&#xff0c;从而帮助…

Spring Boot 乐观锁加锁失败 - 集成AOP

Spring Boot with AOP 手头上的项目使用了Spring Boot&#xff0c; 在高并发的情况下&#xff0c;经常出现乐观锁加锁失败的情况&#xff08;OptimisticLockingFailureException&#xff0c;同一时间有多个线程在更新同一条数据&#xff09;。为了减少直接向服务使用者直接返回…