Jenkins pipeline 脚本语言学习支持

1 引言

Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。 使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。

Groovy是一种基础JVM(Java虚拟机)的敏捷开发语言,他结合了Python、Ruby和Smalltalk的特性,Groovy代码能够于Java代码很好的结合,也能用于扩展现有代码。 由于其运行在JVM的特性,Groovy可以使用其他Java语言编写法的库。

for(int i=0; i<10; i++) {...
}10.times{...
}

在使用Groovy编程时,Java有的Groovy几乎都有。Groovy同样扩展了java.lang.Object类,Groovy类就是Java类,Java语义都保留下来了,所以使用Groovy编写的表达式和语句, 对于Java程序员而言,理解它没有任何障碍。
在这里插入图片描述
在这里插入图片描述
Groovy虽然支持Java的语法但它并没有强迫我们学习新的类和库,而是通过向JDK中各种类添加方法,所以说Groovy扩展了JDK,这些扩展称之为GDK (Groovy JDK)。

Java中可以使用java.lang.process与系统级进程进行交互,例如,我们在代码中调用git的help命令并把help的内容打印出来,用Java的实现代码如下:

package com.zs.groovy;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class ExecuterProcessor {public static void main(String[] args) {try {// 获取process实例Process process = Runtime.getRuntime().exec("git help");// 读取输入流BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line = "";while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

转化为 groovy 语法:

print "git help".execute().text

2 基本语法

2.1 标识符

在这里插入图片描述

2.2 字符串

Groovy允许实例化java.lang.String类来定义一个字符串对象,同样地,也可以通过实例化groovy.lang.GString类定义一个字符串对象,两者可以混合使用。

def a = 'i am zhaoshuai-lc'
def b = '''i am zhaoshuai-lcandi am a male
'''
// 说明:用单引号或三个单引号定义的字符串不支持混合编程def c = "hello zhaoshuai-lc"
> def name = "zhaoshuai-lc"
> def _name = "hello ${name}"
> print _name
hello zhaoshuai-lc

三个双引号引起来的字符串:
用"""引号引起来的字符串行为上和双引号引起来的字符串是一样的,不同之处在于它代表多行字符串,就像三个单引号定义的字符串。例如:

def name = 'zhaoshuai-lc'
def template = """Dear $namei love U
"""
print(template)

如果是使用内置变量类型定义的变量,一经定义,后面是不可以更改变量类型的。但是Groovy也提供了类似javascript中的any定义任意变量类型的关键字def。

class Example { static void main(String[] args) { def _Name = 1;_Name="it飞牛"; println(_Name);} 
}
//打印如下:
it飞牛

在这里插入图片描述

2.3 数值类型

byte -这是用来表示字节值。例如2。
short -这是用来表示一个短整型。例如10。
int -这是用来表示整数。例如1234。
long -这是用来表示一个长整型。例如10000090。
float -这是用来表示32位浮点数。例如12.34。
double -这是用来表示64位浮点数,这些数字是有时可能需要的更长的十进制数表示。例如12.3456565。
char -这定义了单个字符文字。例如“A”。
Boolean -这表示一个布尔值,可以是true或false。
String -这些是以字符串的形式表示的文本。例如,“Hello World”。

在这里插入图片描述
在这里插入图片描述
不同类型数值进行算术运算的规则:
对于二元运算符,两个不同类型的数值进行运算后它们的结果按照以下规则确定
对于byte、char、short、int这几种类型之间运算的结果为int
涉及long与byte、char、short、int之间运算的结果为long
涉及BigInteger与其它类型数值之间的运算结果为BigInteger
BigDecimal与byte、char、short、int之间的运算结果为BigDecimal
float、double与BigDecimal之间的运算结果为double
两个BigDecimal之间的运算结果为BigDecimal

2.4 数组与集合

Groovy没有自己的集合类型,它的List类型实际上用的就是JDK中的java.util.List包。当我们定义一个集合对象,Groovy默认采用Java.util.ArrayList类型。

> def numbers = [1, 2, 3]
> assert numbers instanceof java.util.List
> assert numbers.size() == 3

也可以在集合中放置不同类型的元素,例如:

def numbers = [1, 2, 3, true, 'false']

默认定义的集合对象属于Java.util.ArrayList类,也可以用as运算符,强制定义List接口的其它实现类的对象,例如:

> def list = [1, 2, 3, 4] as LinkedList
> assert list instanceof LinkedList
> def list = [1, 2, 3, 4] as LinkedList
> assert 1 == list[0]
> assert 4 == list[-1]
> list << true
> print list[4]
true

Groovy 可以定义多维集合,例如:

def multi = [[0, 1], [2, 3]]

Groovy中数组和集合的表示方式相同,也就是说Groovy复用list的表示形式来表示数组,但必须显式的声明数组的类型,例如:

> String[] arrStr = ['zhaoshuai-lc', 'zhaoshuai-la', 'zhaoshuai-lb']
> assert arrStr instanceof String[]
> assert !(arrStr instanceof List)

使用as运算符,强制转化为要定义的类型:

> def intArr = [1, 2, 3] as int[]
> assert intArr instanceof int[]

也可以定义多维数组:

> def _matrix = new Integer[2][3]
> assert _matrix.size() == 2

声明时不指定数组元素个数:

> Integer[][] arr
> arr = [[1, 2, 3], [2, 3]]
> print arr.length
2

访问数组元素时按照和list—样的方式,使用下标运算符[],例如:

> String[] strArr = ['zjaosuia', 'dafas', 'erqrw']
> print strArr[2]
erqrw

Java 风格化:

> def primes = new int[]{2, 3, 4, 1, 6}
> assert primes.length == 5 && primes.sum() == 16
> 
> def pets = new String[]{'zhaoshuai', '-', 'lc'}
> assert pets.size() === 3 && pets.sum() == 'zhaoshuai-lc'
> 
> String[] groovyArr = ['zhaoshuaiA', '-A', 'lcA']
> assert groovyArr.every { it -> it.contains('A') }

2.4.1 List 语法详解

groovy 列表使用索引操作符 [] 索引。列表索引从 0 开始,指第一个元素。groovy 中的一个列表中的数据可以是任意类型。这 java 下集合列表有些不同,java 下的列表是同种类型的数据集合。
List.reverse() 可以实现列表反转。
调用 List.sort() 可以实现列表排序。

> def list1 = []
> def list2 = [1, 2, 3, 4]
> list2.add(12)
> list2.add(12)
> println list1.size()
> println list2.size()
0
6

1、搜索-find

class Main {static void main(String[] args) {def list = [1, 2, 3, 1, 2, 3];// find:返回第一个符合条件的项def find = list.find( item -> item == 1)assert 1 == find// findAll:返回所有符合条件的项def findA = list.findAll( item -> item == 1)assert [1, 1] == findA// findIndexOf:返回满足条件的第一个元素的下标值。def index = list.findIndexOf(item -> item == 1)assert 0 == index}
}

2、排序-sort、reverse

class Main {static void main(String[] args) {def list = [1, 2, 3, 1, 2, 3];// sort-正序排序print list.sort();// sort-倒叙排序print list.sort((a, b) -> b - a)// reverse:将原list倒序,返回一个新的listprint list.reverse();}
}

3、返回新数组-collect、tail

class Main {static void main(String[] args) {def list = [1, 2, 3, 1, 2, 3];// collect:返回一个新的list,他可以接受一个闭包参数或者无参。类似js中map。it是闭包中自带的隐式变量;println list.collect(item -> item + 100)// tail:返回一个新的list,它包含list中的所有的元素(除了第一个元素)println list.tail(); // [2, 3, 1, 2, 3]}
}

4、遍历 each、eachWithIndex

class Main {static void main(String[] args) {def list = [1, 2, 3, 1, 2, 3];// each:普通的迭代遍历list.each(item -> print item)//eachWithIndex:他的作用和each一样,但是他要传入一个闭包,有两个参数,一个是值,一个是索引。list.eachWithIndex { int entry, int i -> println("${entry}--${i}")}}
}

every、any、first、last、max、min、count、unique

class Main {static void main(String[] args) {def list = [1, 2, 3, 1, 2, 3];// every:接收一个闭包,返回为一个布尔值,当所有条件都满足时才返回trueprintln list.every(item -> item > 0)// any:和every用法一样,只要有一个为true,则返回trueprintln list.any(item -> item > 0)//返回第一个数据println(list.first());//返回最后一个数据println(list.last());//返回最大值println(list.max());//返回最小值println(list.min());//返回总和println(list.sum());//返回某项出现的次数println(list.count(3));//返回去重后的数组println(list.unique());}
}

5、分组

class Main {static void main(String[] args) {def items = [[name: "tony", age: 4], [name: "tony", age: 5], [name: "alan", age: 16]]def groups = items.groupBy { it.name }println(groups);// [tony:[[name:tony, age:4], [name:tony, age:5]], alan:[[name:alan, age:16]]]}
}

6、包含

class Main {static void main(String[] args) {def list = [1, 2, 3, 1, 2, 3];def list2 = [1, 2, 3, 4];println(list.containsAll(list2));println(list2.containsAll(list));}
}

2.5 Map映射

Groovy的map对象 就是LinkedHashMap的实例
在这里插入图片描述

class Example { static void main(String[] args) { def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"] println(mp.get("TopicName")); println(mp.get("Topic")); } 
}

2.6 对象运算符

安全导航运算符(safe navigation operator) 主要作用为避免出现NullPointerException异常,如果出现空指针异常,使用安全导航运算符将返回null,而不是抛出异常。例如:

> class Person{
>     int id
> 
>     Person(int id) {
>         this.id = id
>     }
> 
>     int getId() {
>         return id
>     }
> 
>     void setId(int id) {
>         this.id = id
>     }
> 
> }
> def person = new Person(3451)
> def _person = person.find{ item -> item.id == 345}
> println _person
> println _person?.id
null
null

直接字段访问运算符(Direct field access operator) 使用该运算符可以不用调用get方法而直接获取字段的值。例如:

> class User {
>     public String name;
>
>     User(String name) {
>         this.name = name;
>     }
>
>     String getName() {
>         "Name: ${name}"
>     }
> }
>
> def user = new User("Bob")
> print user.name
> assert user.name == 'Name: Bob'
Name: Bob> class User {
>     public String name;
>
>     User(String name) {
>         this.name = name;
>     }
>
>     String getName() {
>         "Name: ${name}"
>     }
> }
>
> def user = new User("Bob")
> print user.@name
> assert user.@name == 'Bob'
Bob

2.7 正则表达式

Groovy使用~”pattern” 来支持正则表达式,它将使用给定的模式字符串创建一个编译好的Java Pattern 对象。Groovy也支持 =~(创建一个Matcher)和 ==~ (返回boolean,是否给定的字符串匹配这个pattern)操作符。

> import java.util.regex.Pattern
>
> def p = ~/foo/
> assert p instanceof Pattern
> def res = p.matcher('foo').matches()
> print res
true
> import java.util.regex.Matcher
>
> def text = 'i am your father'
> def res = text =~ /father/
> assert res instanceof Matcher
> print res.matches()
false
> import java.util.regex.Matcher
>
> def text = 'i am your father'
> def res = text ==~ /father/
> assert res instanceof Boolean
> print res
false

3 类与脚本

Groovy提供了两种代码方式,一种是脚本一种是类,首先我们定义一个名为Main.groovy的类。代码如下:

class Main{static void main(String[] args) {print 'hello zhaoshuai-lc'}
}print 'hello zhaoshuai-lc'
print 'hello zhaoshuai-lc'

上面的脚本实由groovy.lang.Script类编译成一个class文件,把脚本代码拷贝到groovy.lang.Script类的run方法中进行执行,实际运行的代码形如下面的内容:

在这里插入图片描述
执行的步骤如下:
Main.class继承Script类
把脚本的主体内容复制到run方法内
然后自动生成main()方法,最后运行run()

方法 可以在脚本中定义方法,例如:

> int fib(int n) {
>     n < 2 ? 1 : fib(n - 1) + fib(n - 2)
> }
>
> assert fib(10) == 89

创建的脚本类在编译后会把脚本中的所有方法装配到run方法中,这些对于用户来说都是透明的。

变量 在脚本中定义变量无需声明变量的类型,例如:

int x = 1
int y = 2
assert x+y == 3
×= 1
y = 2
assert x+y == 3

这两者在语义上有一些差别,上面的例子中声明的变量属于局部变量,只在run方法内部可见,而下面的无声明变量定义对于其它方法可见, 这对于脚本与其它应用程序共享数据就显得很重要了。

Groovy类是数据的集合和对该数据进行操作的方法的载体,类的数据和方法用于表示问题域中的一些现实世界对象。 Groovy中的类声明了该类定义的对象的状态(数据)和行为。因此,Groovy类描述了该类的实例字段和方法。
在这里插入图片描述
在任何编程语言中,总是使用private关键字隐藏实例成员,通过提供getter和setter方法来相应地设置和获取实例变量的值。例如下面的代码:

在这里插入图片描述
内部类定义在另一个类中,外层类可以访问内部类,内部类也可以使用外层类的成员变量,即使是私有的。其它类不能访问内部类。内部类的示例如下:

class Main {static void main(String[] args) {def outer = new Outer()outer.name = 'zhaoshuai-lc'outer.callInnerMethods()}
}class Outer {String namedef callInnerMethods() {new Inner().methodInner()}class Inner {def methodInner() {print name}}
}

extends是用于继承类的关键字,我们通过一个示例介绍groovy中如何继承其它类:

class Main {static void main(String[] args) {def sub = new Sub('zhaoshuai-lc')}
}class Outer {public String nameOuter(String name) {print name}
}
class Sub extends Outer {Sub(String subName) {super(subName)}
}

抽象类表示通用概念,因此它不能被实例化,但可以被继承。抽象类中的抽象方法只有方法的定义而没有方法的实现,它的实现通过继承它的类来完成,定义抽象类通过关键字 abstract来声明,抽象方法也是同样的。

接口定义了类需要遵守的规范,接口仅定义需要实现的方法的列表,但是不定义方法实现。 接口需要使用interface关键字声明接口,接口的方法总是公开的,在接口中使用受保护或私有方法是一个错误。

class Example {static void main(String[] args) {Student st = new Student();st.StudentID = 1;st.Marks1 = 10;println(st.DisplayMarks());} 
} interface Marks { void DisplayMarks(); 
} class Student implements Marks {int StudentIDint Marks1;void DisplayMarks() {println(Marks1);}
}

4 闭包

闭包可以接收入参
闭包可以引用外部变量

class Example {     static void main(String[] args) {def str1 = "Hello";def clos = {param -> println "${str1} ${param}"}clos.call("World");// We are now changing the value of the String str1 which is referenced in the closurestr1 = "Welcome";clos.call("World");} 
}//打印
Hello World 
Welcome World

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

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

相关文章

用Python写了一个下载网站所有内容的软件,可见即可下

目录标题 前言环境介绍:代码实战获取数据获取视频采集弹幕采集评论 GUI部分尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 今天我们分享一个用Python写下载视频弹幕评论的代码。 顺便把这些写成GUI&#xff0c;把这些功能放到一起让朋友用起来更方便~ 环境介绍: py…

tinkerCAD案例:29. 摇头娃娃

Research Your Favorite Bobblehead 摇头娃娃 Project Overview: 项目概况&#xff1a; Design and create your favorite Minecraft 3D bobble head. All you need is a computer, 3D printer, spring and your creativity to your favorite Minecraft character in the for…

dreamStudio试用教程【AI绘画】

文章目录 dreamStudio 简介打开官网如下邮箱登录即可切换随机提示词新用户的试用次数目前只有25张图像&#x1f4d9; 预祝各位 前途似锦、可摘星辰 dreamStudio 简介 https://github.com/Stability-AI/StableStudio StabilityAI在官网上重磅宣布——旗下的文生图应用DreamStu…

智能提词器有哪些?了解一下这款提词工具

智能提词器有哪些&#xff1f;使用智能提词器可以帮助你更好地准备和交付演讲、报告或其他提词场合。它可以提高你的效率&#xff0c;节省你的时间&#xff0c;并让你更加自信地与听众沟通。另外&#xff0c;智能提词器还可以提供一些有用的功能&#xff0c;如语音识别、智能建…

Spring Boot实践三 --数据库

一&#xff0c;使用JdbcTemplate访问MySQL数据库 1&#xff0c;确认本地已正确安装mysql 按【winr】快捷键打开运行&#xff1b;输入services.msc&#xff0c;点击【确定】&#xff1b;在打开的服务列表中查找mysql服务&#xff0c;如果没有mysql服务&#xff0c;说明本机没有…

迁移学习、微调、计算机视觉理论(第十一次组会ppt)

@TOC 数据增广 迁移学习 微调 目标检测和边界框 区域卷积神经网络R—CNN

IDEA开启并配置services窗口

前言&#xff1a; 一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时&#xff0c;如果要调试测需要依次启动各个项目比较麻烦。 方法一&#xff1a; 默认第一次打开项目的时候&#xff0c;idea会提示是否增加这个选项卡&#xff0c;如果你没…

《golang设计模式》第一部分·创建型模式-03-建造者模式(Builder)

文章目录 1. 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概念 1.1 角色 Builder&#xff08;抽象建造者&#xff09;&#xff1a;给出一个抽象接口&#xff0c;以规范产品对象的各个组成成分的建造。ConcreteBuilder&#xff08;具体建造者&#xff09;&a…

NOsql之MongoDB入门分享

目录 一、MongoDB简介 1、概念理解 2、yum安装部署 3、二进制安装部署 4、配置文件解析 二、MongoDB基本管理 1、登录操作 2、管理命令 3、用户管理 一、MongoDB简介 1、概念理解 关系型数据库&#xff08;RDBMS:Relational Database Management System) MySql、Ora…

STM32-风速传感器(ADC)

目录 0 说明 1 传感器介绍 2 代码说明 2.1 ADC.c 2.2 adc.h 2.3 main.c 0 说明 本篇文章主要是说明怎么使用STM32单片机读取风速传感器采集到的数据&#xff0c;读取方式是ADC&#xff0c;并且附带着STM32所需要的全部代码&#xff0c;所使用的风速传感器如下图所示。 附&am…

IDEA的基础使用——【初识IDEA】

IDEA的基础使用——【初识IDEA】 文章目录 IDEA简介前言官网 IDEA的下载与安装选择下载路径勾选自己需要的其余按默认选项进行即可 目录简介安装目录简介 运行Hello WorldIDEA快捷键常用模板模板一&#xff1a;psvm&#xff08;main&#xff09;模板二&#xff1a;模板三&#…

PHP-Mysql好运图书管理系统--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 首页必要的项目知识ThinkPHP的MVCThinkTemplateThinkPHP 6和ThinkPHP 5 phpStudy 设置导数据库前台展示页面后台的管理界面数据库表结构项目目录如图&#xff1a;代码部分&a…

【c语言初级】c++基础

文章目录 1. C关键字2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.2 C函数重载的原理--名字修饰采用C语言编译器编译后结果 1. C关键字 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想…

android studio 找不到符号类 Canvas 或者 错误: 程序包java.awt不存在

android studio开发提示 解决办法是&#xff1a; import android.graphics.Canvas; import android.graphics.Color; 而不是 //import java.awt.Canvas; //import java.awt.Color;

JNPF-一个真正可拓展的低代码全栈框架

一、前言 尽管现在越来越多的人开始对低代码开发感兴趣&#xff0c;但已有低代码方案的一些局限性仍然让大家有所保留。其中最常见的担忧莫过于低代码缺乏灵活性以及容易被厂商锁定。 显然这样的担忧是合理的&#xff0c;因为大家都不希望在实现特定功能的时候才发现低代码平台…

iOS--frame和bounds

坐标系 首先&#xff0c;我们来看一下iOS特有的坐标系&#xff0c;在iOS坐标系中以左上角为坐标原点&#xff0c;往右为X正方向&#xff0c;往下是Y正方向如下图&#xff1a; bounds和frame都是属于CGRect类型的结构体&#xff0c;系统的定义如下&#xff0c;包含一个CGPoint…

ConcurrentHashMap底层具体实现以及实现原理

问题描述 ConcurrentHashMap 底层具体实现以及实现原理 分析维度&#xff1a; 1. ConcurrentHashMap的整体架构 2. ConcurrentHashMap的基本功能 3. ConcurrentHashMap在性能方面的优化 解决方案&#xff1a; ConcurrentHashMap 的整体架构 如图所示&#xff0c;这个是 Concu…

清风数学建模——层次分析法

层次分析法 文章目录 层次分析法评价类问题可以用打分来解决1.通过查阅资料选定指标2.画出权重表格并填写2.1.判断矩阵一致矩阵2.3一致性检验的步骤先算一致性指标CI根据表格查找n对应的RI&#xff08;平均随机一致性指标&#xff09;&#xff0c;表格一般会在题目中给出计算一…

【iOS】—— UIKit相关问题

文章目录 UIKit常用的UIKit组件懒加载的优势 CALayer和UIView区别关系 UITableViewUITableView遵循的两个delegate以及必须实现的方法上述四个必须实现方法执行顺序其他方法的执行顺序&#xff1a; UICollectionView和UITableView的区别UICollectionViewFlowLayout和UICollecti…

uniapp scroll-view显示滚动条

在style中添加样式&#xff1a; ::v-deep ::-webkit-scrollbar {/* 滚动条整体样式 */display: block;width: 10rpx !important;height: 10rpx !important;-webkit-appearance: auto !important;background: transparent;overflow: auto !important;}::v-deep ::-webkit-scroll…