Groovy 使用完全解析
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70313790
本文出自【赵彦军的博客】
- 概念
- Groovy 配置环境变量
- 开发工具 IntelliJ IDEA
- Groovy 语法
- 基本语法
- 定义变量
- 定义函数
- 断言 assert
- 循环 for
- 循环 time
- 三目运算符
- 捕获异常
- switch
- 判断是否为真
- asType
- Groovy 数据类型
- Java 基本类型
- Groovy 容器
- 闭包
- Java 属性
- 再识 Groovy
- Script 类
- 脚本变量的作用域
- JSON 操作
- 对象转json json 转对象
- 集合对象转json json 转集合对象
- IO 操作
- 文本文件读
- 文本文件写
- 文件夹操作
- 深度遍历文件
- InputStream
- xml 解析
- 实例1 解析简单xml
- 实例2 解析复杂 xml
概念
Groovy是一种动态语言,它和Java类似(算是Java的升级版,但是又具备脚本语言的特点),都在Java虚拟机中运行。当运行Groovy脚本时它会先被编译成Java类字节码,然后通过JVM虚拟机执行这个Java字节码类。
Groovy 配置环境变量
在 Groovy 官网下载压缩包 http://www.groovy-lang.org/download.html
然后解压到本地,如图所示:
- 在
Path
环境变量中添加 Groovy 的bin 目录路径,比如:
D:\soft\apache-groovy-sdk-2.4.10\groovy-2.4.10\bin
如图所示:
- 用 CMD 打开命令行,执行:
groovy -version
, 如果看到如下提示,就代表配置成功了。
Groovy Version: 2.4.10 JVM: 1.8.0_112 Vendor: Oracle Corporation OS: Windows 10
如图所示:
开发工具 IntelliJ IDEA
groovy 的开发工具是 IntelliJ IDEA
下载地址: https://www.jetbrains.com/idea/
安装完成后,新建项目 ,项目类型选择 Groovy ,然后填写 JDK 、Groovy 的安装目录
新建的项目 Groovy 如下图所示:
在 src 目录下,新建包名 groovy , 并且创建 groovy 源文件 Test.groovy,如下图所示:
现在我们在 Test.groovy 中输出一句 helloword ,代码如下:
package groovyprintln( "hello world")
运行 Test.groovy 文件 ,如下图所示:
Groovy 语法
基本语法
1、Groovy注释标记和Java一样,支持 //或者/**/
2、Groovy语句可以不用分号结尾。Groovy为了尽量减少代码的输入,确实煞费苦心
3、单引号
单引号” 中的内容严格对应Java中的String,不对 $ 符号进行转义
def s1 = 'i am 100 $ dolloar'
println( s1 )
运行结果:
i am 100 $ dolloar
4、双引号
双引号”“的内容则和脚本语言的处理有点像,如果字符中有
def x = 100
def s1 = "i am $x dolloar"println( s1 )
运行结果:
i am 100 dolloar
5、三引号
三个引号”’xxx”’中的字符串支持随意换行 比如
def s1 = ''' x
y
z
f
'''println(s1)
运行结果:
x
y
z
f
定义变量
Groovy中支持动态类型,即定义变量的时候可以不指定其类型。Groovy中,变量定义可以使用关键字def。注意,虽然def不是必须的,但是为了代码清晰,建议还是使用def关键字
- 定义一个变量
def a = 1 //定义一个整形def b = "字符串" //定义一个字符串def double c = 1.0 //定义一个 double 类型,也可以指定变量类型
定义函数
无返回类型的函数定义,必须使用def关键字 ,最后一行代码的执行结果就是本函数的返回值
//无参函数
def fun1(){}//有参函数 , 无需指定参数类型
def fun2( def1 , def2 ){}
如果指定了函数返回类型,则可不必加def关键字来定义函数
String fun3(){return "返回值"
}
其实,所谓的无返回类型的函数,我估计内部都是按返回Object类型来处理的。毕竟,Groovy 是基于Java 的,而且最终会转成 Java Code 运行在 JVM 上 .
Groovy的函数里,可以不使用return xxx 来设置 xxx 为函数返回值。如果不使用 return 语句的话,则函数里最后一句代码的执行结果被设置成返回值。
def getSomething(){ "getSomething return value" //如果这是最后一行代码,则返回类型为String 1000 //如果这是最后一行代码,则返回类型为Integer
}
除了每行代码不用加分号外,Groovy中函数调用的时候还可以不加括号
例子1:
def s1 = "123"println(s1)//或者println s1
例子2:
println(fun1())println fun1()def fun1(){"你好"
}
效果:
你好
你好
断言 assert
- 断言变量为空
def s1 = nullassert s1
效果如下:
- 断言变量的长度
def s2 = "abc"assert s2.size()>3
效果如下:
如果断言发生,断言后面的代码无法执行
循环 for
- 方式一
for (i = 0; i < 5 ; i++) {println("测试")
}
1、运行结果: 输出5个测试
2、groovy 语法中,注意 i 前面不用指定 int 类型。
- 方式二
for (i in 0..5){println("hello world")
}
这种方式也是一种循环,只不过他输出的是 6 个 hello world
, 如果想要输出5个,有3中方式。
第一种方法
for (i in 0..<5){println("hello world")
}
第二种方法
for (i in 0..4){println("hello world")
}
第三种方法
for (i in 1..5){println("hello world")
}
循环 time
times表示从0开始循环到4结束
4.times {println it
}
结果:
0
1
2
3
三目运算符
Java 语法
def name
def result = name != null ? name : "abc"
println(result)
groovy 语法
def name = 'd'
def result = name?: "abc"
捕获异常
捕获所有的 Exception ,有两种写法
//第一种写法,Java 写法
try {println 5 / 0
} catch (Exception e) {}//第二种写法,Groovy 写法
try {println 5 / 0
} catch (anything) {}
这里的any并不包括Throwable,如果你真想捕获everything,你必须明确的标明你想捕获Throwable
switch
age = 36
def rateswitch (age) {case 10..26:rate = 0.05breakcase 27..36:rate = 0.06breakcase 37..46:rate = 0.07breakdefault:throw new IllegalArgumentException()
}println( rate)
判断是否为真
Person person//Java 写法
if (person!= null){if (person.Data!=null){println person.Data.name}
}//Groovy
println person?.Data?.name
asType
asType 就是数据类型转换
//String 转成 int
def s2 = s1 as int//String 转成 int
def s3 = s1.asType(Integer)
Groovy 数据类型
Groovy中的数据类型主要分2种
一个是Java中的基本数据类型。
另外一个是Groovy中的容器类。
最后一个非常重要的是闭包。
Java 基本类型
def boolean s1 = truedef int s2 = 100def String s3 = "hello world"if (s1) {println("hello world")
}
Groovy 容器
List:链表,其底层对应Java中的List接口,一般用ArrayList作为真正的实现类。
Map:键-值表,其底层对应Java中的LinkedHashMap。
Range:范围,它其实是List的一种拓展。
- List
//变量定义:List变量由[]定义,其元素可以是任何对象
def aList = [5,'string',false]println(aList)println aList[0] //获取第1个数据println aList[1] //获取第2个数据println aList[2] //获取第3个数据println aList[3] //获取第4个数据println( "集合长度:" + aList.size())//赋值aList[10] = 100 //给第10个值赋值aList<<10 //在 aList 里面添加数据println aListprintln "集合长度:" + aList.size()
效果如下:
[5, string, false]
5
string
false
null
集合长度:3
[5, string, false, null, null, null, null, null, null, null, 100]
集合长度:11
- map
def map = [key1: "value1", key2: "value2", key3: "value3"]println map
//[key1:value1, key2:value2, key3:value3]println("数据长度:" + map.size())
//数据长度:3println(map.keySet())
//[key1, key2, key3]println(map.values())
//[value1, value2, value3]println("key1的值:" + map.key1)
//key1的值:value1println("key1的值:" + map.get("key1"))
//key1的值:value1//赋值
map.put("key4", "value4")Iterator it = map.iterator()
while (it.hasNext()) {println "遍历map: " + it.next()
}//遍历map: key1=value1
//遍历map: key2=value2
//遍历map: key3=value3
//遍历map: key4=value4map.containsKey("key1") //判断map是否包含某个keymap.containsValue("values1") //判断map是否包含某个valuesmap.clear() //清除map里面的内容Set set = map.keySet(); //把 map 的key值转换为 set
- range
Range 是 Groovy 对 List 的一种拓展
def range = 1..5println(range)
//[1, 2, 3, 4, 5]range.size() //长度range.iterator() //迭代器def s1 = range.get(1) //获取标号为1的元素range.contains( 5) //是否包含元素5range.last() //最后一个元素range.remove(1) //移除标号为1的元素range.clear() //清空列表
例子2:
def range = 1..5println(range)
//[1, 2, 3, 4, 5]println("第一个数据: "+range.from) //第一个数据
//第一个数据: 1println("最后一个数据: "+range.to) //最后一个数据
//最后一个数据: 5
闭包
闭包,英文叫Closure,是Groovy中非常重要的一个数据类型或者说一种概念了。闭包,是一种数据类型,它代表了一段可执行的代码。
def aClosure = {//闭包是一段代码,所以需要用花括号括起来.. String param1, int param2 -> //这个箭头很关键。箭头前面是参数定义,箭头后面是代码 println"this is code" //这是代码,最后一句是返回值, //也可以使用return,和Groovy中普通函数一样
}
简而言之,Closure的定义格式是:
def xxx = {paramters -> code} //或者
def xxx = {无参数,纯code}
说实话,从C/C++语言的角度看,闭包和函数指针很像。闭包定义好后,要调用它的方法就是:
闭包对象.call(参数)
或者更像函数指针调用的方法:
闭包对象(参数)
比如:
aClosure.call("this is string",100) //或者
aClosure("this is string", 100)
实例演练,源码如下
def fun1 = {p1 ->def s = "我是一个闭包," + p1
}println(fun1.call()) //闭包 调用方式1println(fun1.call("我是一个参数")) //闭包 调用方式2println(fun1("我是一个参数2"))
运行结果如下:
我是一个闭包,null
我是一个闭包,我是一个参数
我是一个闭包,我是一个参数2
闭包没定义参数的话,则隐含有一个参数,这个参数名字叫it,和this的作用类似。it代表闭包的参数。
def fun2 = {it-> "dsdsd"
}println( fun2.call())
如果在闭包定义时,采用下面这种写法,则表示闭包没有参数!
def fun3 = {-> "dsdsd"
}println( fun3.call())
如果调用 fun3 的时候传递参数就会报错,比如
fun3.call("d") //执行这个方法的时候就会报错
省略圆括号
def list = [1,2,3] //定义一个List//调用它的each,这段代码的格式看不懂了吧?each是个函数,圆括号去哪了?list.each {println(it)
}//结果/*** 1* 2* 3*/
each函数调用的圆括号不见了!原来,Groovy中,当函数的最后一个参数是闭包的话,可以省略圆括号。比如
def fun(int a1,String b1, Closure closure){ //dosomething closure() //调用闭包
}
那么调用的时候,就可以免括号!
fun (4, "test", { println"i am in closure"
})
注意,这个特点非常关键,因为以后在Gradle中经常会出现这样的代码:
task hello{doLast{println("hello world")}
}
省略圆括号虽然使得代码简洁,看起来更像脚本语言
Java 属性
Groovy中可以像Java那样写package,然后写类。比如我们在 Person.groovy 文件中编写Java 代码,如下所示:
然后我们新建 Test.groovy 类,写测试工程,如下所:
运行结果如下所示:
Person{name='zhaoyanjun', age=20}
当然,如果不声明public/private等访问权限的话,Groovy中类及其变量默认都是public的.
再识 Groovy
Java中,我们最熟悉的是类。但是我们在Java的一个源码文件中,不能不写class(interface或者其他….),而Groovy可以像写脚本一样,把要做的事情都写在xxx.groovy中,而且可以通过groovy xxx.groovy直接执行这个脚本。这到底是怎么搞的?
既然是基于Java的,Groovy会先把xxx.groovy中的内容转换成一个Java类。
在运行完 Test.groovy 后,发现会产生一个 out 目录,在这个目录里面可以看到 Person.groovy 、Test.groovy 被转换成了 .class 文件,如下图所示:
编译完成后,.groovy 文件都被转换成了 .class 文件,每个 .class 文件都默认有静态 main 方法。每一个脚本都会生成一个static main函数。这样,当我们groovytest.groovy的时候,其实就是用java去执行这个main 函数。
脚本中的所有代码都会放到run函数中。比如,println ‘Groovy world’,这句代码实际上是包含在run函数里的。
Test 继承 Script 类。
Script 类
在 groovy 的库文件中,可以看到 Script 类是一个抽象类,继承 GroovyObjectSupport 类,如下所示
脚本变量的作用域
在 Test.groovy 里面定义变量 s1 , 方法 fun1 , 同时在 fun1 方法中输出 s1 , 代码如下:
一运行就报错,错误如下
通过 out 目录,查看 Test.class 类如下:
可以看到在 s1 变量定义在 run 方法中,相当于局部变量,fun1 方法自然无法访问 s1 .
解决方法也很简单 ,就是把 s1 的 def 去掉,代码如下:
通过 out 目录,查看 Test.class 类如下:
上图中 s1 也没有被定义成 Test 的成员函数,而是在 run 的执行过程中,将 s1 作为一个属性添加到 Test 实例对象中了。然后在print s1 中,先获取这个属性。但是从反编译的实际上看,s1 并没有成为 Test.class 的成员变量,其他脚本却无法访问 s1 变量 。
怎样使 s1 彻彻底底变成 Test 的成员变量?
答案也很简单在 s1 前面加上 @Field 字段
@Field s1 = "123" //s1 彻彻底底变成 Test 的成员变量
反编译效果如下:
JSON 操作
JsonOutput 类把对象转换成 json字符串。
JsonSlurper 类把 json 字符串转换成对象
定义 Person 实体类
public class Person {String name;int age;
}
对象转json 、 json 转对象
Person person = new Person();
person.name = "zhaoyanjun"
person.age = 27//把对象转换为 json 字符串
def json =JsonOutput.toJson(person)println(json)JsonSlurper jsonSlurper = new JsonSlurper()//把字符串转换为对象
Person person1 = jsonSlurper.parseText(json)println( person1.name )
运行效果如下图:
{"age":27,"name":"zhaoyanjun"}
zhaoyanjun
集合对象转json 、json 转集合对象
Person person = new Person();
person.name = "zhaoyanjun"
person.age = 27Person person1 = new Person();
person1.name = "zhaoyanjun2"
person1.age = 28def list = [person,person1]//把集合对象转换为 json 字符串
def jsonArray =JsonOutput.toJson(list)println(jsonArray)JsonSlurper jsonSlurper = new JsonSlurper()//把字符串转换为集合对象
List<Person> list2 = jsonSlurper.parseText(jsonArray)println( list2.get(1).name )
运行结果为:
[{"age":27,"name":"zhaoyanjun"},{"age":28,"name":"zhaoyanjun2"}]
zhaoyanjun2
I/O 操作
Groovy的 I/O 操作是在原有Java I/O操作上进行了更为简单方便的封装,并且使用Closure来简化代码编写。虽然比Java看起来简单,但要理解起来其实比较难。
文本文件读
在电脑上新建一个文本文件 test.txt , 内容如下:
今天是星期五
天气很好
明天就要放假了
下面用 groovy 读取里面的文本
def filePath = "C:/Users/T/Desktop/test.txt"
def file = new File(filePath) ;file.eachLine {println it
}
你没有看错,就是这么简单,groovy 的文件读取操作简单到令人发指。但是这不够,还有跟令人发指的操作,比如:
def filePath = "C:/Users/T/Desktop/test.txt"
def file = new File(filePath) ;println file.text //输出文本
看到这里,发现 Groovy 操作文件比 Java 简单了 100 倍,苍天啊!
更多用法
- 指定编码格式
def filePath = "C:/Users/T/Desktop/test.txt"
def file = new File(filePath);//指定编码格式为 utf-8
file.eachLine("utf-8") {println it //读取文本
}
- 把小写转成大写
def filePath = "C:/Users/T/Desktop/test.txt"
def file = new File(filePath);file.eachLine {println( it.toUpperCase() )
}
文本文件写
- 方式1
def filePath = "C:/Users/T/Desktop/test.txt"
def file = new File(filePath);file.withPrintWriter {it.println("测试")it.println("hello world")
}
- 方式2
def filePath = "C:/Users/T/Desktop/test.txt"
def file = new File(filePath);def out = file.newPrintWriter();
out.println("测试")
out.println("hello world")
out.flush()
out.close()
效果如下:
文件夹操作
- 遍历文件夹中的文件、文件
def filePath = "C:/Users/T/Desktop/123"
def file = new File(filePath);//遍历 123 文件夹中文件夹
file.eachDir {println "文件夹:"+it.name
}//遍历 123 文件夹中的文件
file.eachFile {println "文件:"+ it.name
}
效果如下:
文件夹:1
文件夹:2
文件夹:3
文件:1
文件:2
文件:3
文件:4.txt
深度遍历文件
def filePath = "e:/"
def file = new File(filePath);//深度遍历目录,也就是遍历目录中的目录
file.eachDirRecurse {println it.name
}//深度遍历文件,包括目录和文件
file.eachFileRecurse {println it.path
}
InputStream
def filePath = "C:/Users/T/Desktop/test.txt"
def file = new File(filePath) ;def ism = file.newInputStream()
//操作ism,最后记得关掉ism.close
使用闭包操作 inputStream,以后在Gradle里会常看到这种搞法
def filePath = "C:/Users/T/Desktop/test.txt"
def file = new File(filePath) ;file.withInputStream {ism->// 操作ism. 不用close。Groovy会自动替你close ism.eachLine {println it //读取文本}
}
确实够简单,令人发指。我当年死活也没找到withInputStream是个啥意思。所以,请各位开发者牢记Groovy I/O操作相关类的SDK地址:
- java.io.File: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/File.html
- java.io.InputStream: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/InputStream.html
- java.io.OutputStream: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/OutputStream.html
- java.io.Reader: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/Reader.html
- java.io.Writer: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/Writer.html
- java.nio.file.Path: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/nio/file/Path.html
xml 解析
在java中解析xml是非常繁琐的,通常需要用10行代码去解析5行的xml文件,非常不经济。在groovy 中解析xml 就很方便了。
实例1 解析简单xml
比如下面一段xml
<?xml version="1.0"?><langs type="current">
<language>Java</language>
<language>Groovy</language>
<language>JavaScript</language>
</langs>
groovy 解析如下:
//获取 xml 文件的 langs 节点
def langs = new XmlParser().parse("C:/Users/T/Desktop/test.xml")//获取type 字段的值
def type = langs.attribute("type")println typelangs.language.each{println it.text()
}
结果如下:
current
Java
Groovy
JavaScript
实例2 解析复杂 xml
xml 如下图所示:
<?xml version="1.0" encoding="UTF-8"?>
<metadata><groupId>com.yiba.sdk</groupId>
<artifactId>weshareWiFiSDk</artifactId>
<version>2.3.3</version><versioning>
<latest>2.3.3</latest><versions><version>2.2.7</version><version>2.3.0</version><version>2.3.1</version><version>2.3.2</version><version>2.3.3</version></versions>
</versioning></metadata>
解析代码如下:
//获取metadata节点
def metadata = new XmlParser().parse("C:/Users/T/Desktop/test1.xml")
//获取metadata下面的 groupId 属性值
def groupId = metadata.groupId.text()
//获取metadata下面的 artifactId 属性值
def artifactId = metadata.artifactId.text()
//获取metadata下面的 version 属性值
def version = metadata.version.text()println groupId + " " + artifactId + " " + version
//获取metadata下面的 versioning 节点
def versioning = metadata.versioning
//获取versioning 下面的 latest 属性值
println versioning.latest.text()
//获取versioning 下面的 versions 节点
def versions = versioning.versions
versions.version.each{ //遍历 versions 下面的version 值println "version" + it.text()
}
结果如下:
com.yiba.sdk weshareWiFiSDk 2.3.3
2.3.3
version2.2.7
version2.3.0
version2.3.1
version2.3.2
version2.3.3
个人微信号:zhaoyanjun125
, 欢迎关注
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Spring MVC请求处理流程
图片来自网上 DispatcherServlet执行流程 上图是一个DispatcherServlet的继承关系 主要看:doService()方法 doService()方法 1.绑定⼀些 Attribute WebApplicationContext / LocaleResolver / ThemeResolver 1 2 3 4 5 // Make framework objects availa…...
2024/4/20 8:57:06 - 基与Vue的图片裁剪vue-cropper组件的使用
项目中上传图片的宽高不统一,导致图片显示的时候出现变形的问题。故而用到了图片裁剪这个组件。 代码仓库 https://github.com/xyxiao001/vue-cropper 实现效果 下载的话用npm和yarn都可以,你喜欢就好。 npm i vue-cropper yarn add vue-cropper 如图…...
2024/4/15 6:43:22 - 详解VSCode下C++环境配置过程
下面记录一下C环境配置文件的配置。 在代码的目录下的.vscode文件夹下创建launch.json、tasks.json launch.json { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlin…...
2024/4/15 6:43:52 - opencv25:模板匹配
目标 在本章中,将学习 使用模板匹配在图像中查找对象函数:cv2.matchTemplate(),cv2.minMaxLoc() 理论 模板匹配是一种用于在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV实现了一个函数cv2.matchTemplate()。 它只是…...
2024/4/18 19:39:20 - C++中的string类型
1、string 类 1.1 和char *的异同 在C当中,除了char *类型,还有专门的字符串类型,就叫做string。 通过包含头文件string就可以使用: include<string> 在很多方面,string类型的使用方法和char *一样࿰…...
2024/4/22 0:42:48 - 67.echarts图x轴y轴、刻度线等样式相关问题
1.不显示坐标轴刻度线 xAxis:{...axisTick:{show:false} } 2.不显示网格线 xAxis:{...splitLine:{show:false} } 3.设置坐标轴颜色 xAxis:{...axisLine:{symbol:[none,arrow],lineStyle:{color:#707B7C} // 坐标轴颜色} } 4.设置X轴刻度间隔显示 xAxis:{...axisLabel:{…...
2024/4/20 21:02:54 - Java 关键字盘点
1. 背景 最近在看源码过程中,发现了一些之前都没怎么使用过或者都不太清楚其到底有何用途的关键字。为了避免在跟源码过程中卡壳,知识盲区带来的影响,因此,在此盘点一下 Java 编程语言中所有的关键字。 2. 关键字总览 序号标识…...
2024/4/24 6:23:14 - 从尾到头打印链表 LeetCode
DAY2. 从尾到头打印链表 LeetCode 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 /*思路:从尾到头打印节点,能想到用栈解决,节点先入栈,然后对vector赋值,还有vector的…...
2024/4/15 6:43:32 - antdv select 样式改变
vue版ant design select 样式调整 布局 <div class"select-wrap"><a-select><a-select-option></a-select-option></a-select> </div>外部的选择框和展示框 # 局部样式 .select-wrap /deep/ .ant-select {width: 100%;color:…...
2024/4/23 15:29:27 - windows下tensorflow2.*的安装(anaconda环境)
环境 windows10 python3.7 anaconda3 安装tesdorflow 创建虚拟环境 conda create -n tensorflow2 python3.8 # 指定python版本号为3.8.虚拟环境的名字为tensorflow2. # 后续的安装在这个环境下进行,免得出错弄坏本机的环境安装tensorflow2以上的版本 激活虚拟环…...
2024/4/18 9:24:04 - promise的一些基础
promise的状态 实例对象中的一个属性 PromiseState 三种状态: pendingresolved / fullfilled 都是表示成功rejected 说明: pending->resolved ;pending->rejected只有这 2 种, 且一个 promise 对象只能改变一次 无论变为成功还是失败, 都会有一个结果数据 …...
2024/4/24 6:30:30 - 【JavaSE系列】Java类与对象,万物皆对象
⭐️前面的话⭐️ 本篇文章带大家认识Java类与对象,我相信大家都听说过面向对象编程,Java正是一种面向对象编程的语言,与C语言不同,C语言是一门面向过程的编程语言。对面向对象与面向过程的区别,我们可以这样理解&…...
2024/4/20 15:32:03 - 多语言国际版在线聊天室/匿名在线聊天室/语音聊天室/网页APP聊天室
私人聊天消息/一对一聊天 私人或一对一聊天功能可供用户无缝聊天。他们可以使用此功能私下分享任何他们想要的东西。管理员可以通过管理仪表板轻松管理私人聊天。 多语言支持 QuChat带有一个内置的语言和翻译管理器。您可以有效地添加自己的语言和翻译。QuChat可以翻译成任何…...
2024/4/15 6:43:33 - Spring为什么不推荐使用@Autowired注解详析
引言 使用IDEA开发时,同组小伙伴都喜欢用Autowired注入,代码一片warning,看着很不舒服,Autowired作为Spring的亲儿子,为啥在IDEA中提示了一个警告:Field injection is not recommended 想搞清楚这个问题之…...
2024/4/20 22:54:03 - Ubuntu20 安装sysv-rc-conf 报错E: Unable to locate package sysv-rc-conf
尝试过手动离线安装、奈何永远过不了依赖包这一步,罢了罢了 添加ubtune源 vim /etc/apt/sources.list ## 添加如下源deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse 更新一下 apt-get update 再次安装 apt-get install …...
2024/4/23 4:29:31 - CentOS-8配置静态IP
环境 centos8.4 配置 cd /etc/sysconfig/network-scripts/vim ifcfg-ens33 修改为 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILIRE_FATALno IPV6_ADDR_GEN_M…...
2024/4/24 4:12:51 - 天津平面设计培训机构选哪家好?
随着互联网的发展。平面设计行业市场需求逐步增大,相关的培训机构近年来也蜂拥而起。所以下定决心学习平面设计的同学,在去哪家机构犯了难。今天诚筑说的小编就告诉你,天津平面设计培训机构哪家靠谱?哪个好? 一般选择机…...
2024/4/7 0:16:47 - python基本运算符
什么是运算符? 运算符是符号,它们告诉解释器执行特定的操作,例如算术,比较,逻辑等。 基本运算符类型 1. 算术运算符 以a 10 b 4为例子 运算符描述实例加法运算,将运算符两边的操作数增加。a b 14…...
2024/4/15 6:43:27 - 入门编程之JDK
目录 1.JDK概述 2.JDK下载 3.环境配置 4.检查环境 1.JDK概述 JDK是java语言的软件开发工具包,是整个java开发的核心,它包含了: JAVA开发工具(jdk\bin)基础开发库(jdk\jre\lib\rt.jar)基础开发库的源码(jdk\src.zip) 2.JDK下载 下载链接…...
2024/4/23 14:50:52 - 设计模式之Visitor访问者模式
1. 抽象类 1.1. 访问者 class Apple; class Pork; class Visitor { public:virtual ~Visitor() default;virtual void visit(Apple* apple) 0;virtual void visit(Pork* pork) 0; protected:Visitor() default; }; 1.2. 元素 //Element(抽象元素)…...
2024/4/19 5:20:24
最新文章
- iOS 17上如何恢复数据?iOS 17 数据恢复软件
“您好,我正在为我的 iPhone 寻找一款iOS 17 数据恢复软件。升级到 iOS 17 后,我丢失了 iPhone 上的所有照片、联系人和消息。有什么建议吗?” ——丹尼 iOS 17数据恢复软件下载 升级到iOS 17后如何恢复丢失的数据?由于在 iPhone…...
2024/4/25 6:13:26 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 布隆过滤器是如何避免缓存穿透的?
布隆过滤器(Bloom filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它的原理是当一个元素被加入集合时,通过几个不同的Hash函数将元素映射成一个位数组中的多个位置,再次查询时如果位数…...
2024/4/13 9:55:48 - 《前端防坑》- JS基础 - 你觉得typeof nullValue === null 么?
问题 JS原始类型有6种Undefined, Null, Number, String, Boolean, Symbol共6种。 在对原始类型使用typeof进行判断时, typeof stringValue string typeof numberValue number 如果一个变量(nullValue)的值为null,那么typeof nullValue "?" const u …...
2024/4/25 5:18:48 - audio_video_img图片音视频异步可视化加载
最近在做即时消息,消息类型除了文字还有音频、视频、图片展示,如果消息很多,在切换聊天框时,会有明显卡顿,后续做了懒加载,方案是只加载用户能看到的资源,看不到的先不加载; LazyAud…...
2024/4/22 22:35:28 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/23 20:58:27 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/23 13:30:22 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/23 13:28:06 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/24 18:16:28 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/23 13:27:44 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/19 11:57:53 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/23 13:29:53 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/23 13:27:22 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/23 13:28:42 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/23 22:01:21 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/23 13:29:23 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/25 0:00:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/25 4:19:21 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/19 11:59:23 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/19 11:59:44 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/24 16:38:05 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/23 13:28:14 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/23 13:27:51 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/23 13:27:19 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57