为什么用Groovy
Flink-CEP的底层是基于Non-deterministic Finite Automaton(NFA,非确定有限自动机)构建的,它是一种用来定义和描述不同状态转换过程的正则(表达式)语言。
Flink-CEP的底层是基于Non-deterministic Finite Automaton(NFA,非确定有限自动机)构建的,它是一种用来定义和描述不同状态转换过程的正则(表达式)语言。
Java:由于出道早、跨平台、纯面向对象、具有JVM、生态成熟等特性,已成为编程语言领域的标杆之一,主要用于三高(高并发、高可用和高性能)
企业级应用的开发。
Python:由于简单、灵活,且第三方算法库众多,已成为网络爬虫、数据科学、人工智能领域的主要编程语言(没有之一
)。
Go:天生就没有所谓线程
,而只有协程
的概念,它主要用来解决网络服务和云计算环境下复杂的系统通讯问题,非常适合于开发云计算、区块链等应用中的原生网络组件。
Scala:运行于JVM之上,在大数据应用领域中处于顶流的Spark(全部源码)和Flink(部分源码)就是用它开发的,所以用它来进行大数据统计分析是再合适不过的。
ArkTS:它是HarmonyOS首推的应用开发语言,是Ark(华为方舟编译器)和TypeScript的结合体。
Drools、Groovy和Aviator:作为规则引擎,其量级从重
到轻
。Drools是用Java开发出来的规则系统,而后两者则是基于JVM的脚本语言。
作为一名《魔兽世界》资深玩家,李星云已经在这款游戏上投入了相当多的时间,那么这个相当多
到底是多少,可不可以稍稍统计一下?
下面的Groovy脚本就来看看李星云到底是怎么玩这款游戏的。
import java.text.SimpleDateFormat
import java.text.ParseException
/**
* 统计游戏玩家
*
*/
class PlayerCount {
def cost = 8_0000
// 氪金玩家
def today = new SimpleDateFormat("yyyy-MM-dd").format(new Date())
// 用户基本信息,这些数据可以来自数据库
def user = ['id' : '12345678',
'username' : '李星云',
'gender' : 'M',
'mobile' : '13888888888',
'birth' : '2001-01-01',
'address' : 'XX省XX市XXX区',
'gold' : 1000_0000,
'regtime' : '2020-01-26 22:08:00',
'copy' : [
[name: '影牙城堡', 'times': 17],
[name: '血色修道院', 'times': 21],
[name: '剃刀高地', 'times': 4],
[name: '玛拉顿', 'times': 8],
[name: '通灵学院', 'times': 7],
[name: '斯坦索姆', 'times': 26],
[name: '黑石塔', 'times': 14],
[name: '祖尔格拉布', 'times': 16],
[name: '熔火之心', 'times': 8],
[name: '黑翼之巢', 'times': 8],
[name: '安琪拉', 'times': 19],
],
'logindate': ['2023-05-01 09:00:02', '2023-06-03 08:50:03',
'2023-07-15 09:12:34', '2023-08-29 07:30:11']
]
// 日期解析函数,取得当前年份
def date1(_date) {
try {
(new SimpleDateFormat("yyyy-MM-dd")).parse(_date).year;
} catch (ParseException e) {
e.printStackTrace()
}
}
// 日期解析函数,取得当前时间戳
def date2(_date) {
try {
// 先尝试一种时间格式
(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse(_date).time;
} catch (ParseException e) {
// 再尝试另一种时间格式
return (new SimpleDateFormat("yyyy-MM-dd")).parse(_date).time;
}
}
// 定义规则
def rules = [
// 子规则:基本信息
'info':
[
// 判断性别
'gender' : user.gender == 'M' ? '男' : '女',
// 计算年龄
'age' : date1(today) - date1(user.birth),
// 计算天数
'regday' : ((date2(today) - date2(user.regtime)) / (1000 * 60 * 60 * 24)).intValue()
],
// 子规则:玩家状态
'status': [
'消费档次': cost >= 5_0000 ? 'A' : (cost >= 4_0000 && cost < 5_0000 ? 'B' : (cost >= 2_0000 && cost < 4_0000) ? 'C' : 'D'),
'拥有金币': {
if (user.gold >= 500_0000) '至尊王者'
else if (user.gold >= 100_0000) '王者'
else if (user.gold >= 50_0000) '黄金'
else if (user.gold >= 30_0000) '白银'
else '青铜'
}(),
'登录次数':user.logindate.size(),
'刷副本数': {
int totaltimes = 0;
// 遍历计数
user.copy.each { totaltimes += it.times }
totaltimes
}(),
'最爱副本': {
int number = 0;
// 遍历比较大小
user.copy.each { number = Math.max(number, it.times) }
user.copy.find({ it.times == number })
}(),
]
]
}
def writeline() {
def player = new PlayerCount()
def username = player.user.username
def gender = player.rules.info['gender']
def age = player.rules.info.age
def regday = player.rules.info.regday
def gold = player.rules.status.拥有金币
def cost = player.rules.status.消费档次
def times = player.rules.status.登录次数
def total = player.rules.status.刷副本数
def max = player.rules.status.最爱副本
// 在这里还可以进一步进行统计,如某些组合条件满足则打印信息
println username + " : " + gender
println "玩家信息.实际年龄 = $age"
println "玩家信息.游戏天数 = $regday"
println "玩家状态.拥有金币 = $gold"
println "玩家状态.消费档次 = $cost"
println "玩家状态.登录次数 = $times"
println "玩家状态.刷副本数 = $total"
println "玩家状态.最爱副本 = $max"
}
writeline()
基本类型 | 包装器类型 |
---|---|
boolean | Boolean |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
Groovy中有算术运算符
、关系运算符
、逻辑运算符
、位运算符
、条件运算符
、对象运算符
和其他运算符
。
Groovy的算术运算符
包括+
(加)、-
(减)、*
(乘)、/
(除)、%
(取模)和**
(幂运算)。