Scala脚本化-Ammonite
Scala语言定义:
Scala combines object-oriented and functional programming in one concise, high-level language.
Scala's static types help avoid bugs in complex applications, and its JVM and JavaScript runtimes let you build high-performance systems with easy access to huge ecosystems of libraries.
--来自Scala官网:https://www.scala-lang.org/
简单翻译一下:Scala 是一个将面向对象与函数式编程简明的结合在一起的高级语言。Scala的静态类型有效的避免了在复杂应用中的Bugs。并且他运行在Java虚拟机上,并且它拥有强大的三方库供调用,这些都可以让你轻松构建高性能的系统。
感觉翻译能力太差,还是做拿来主义吧,网上的翻译:
Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
Scala 运行在Java虚拟机上,并兼容现有的Java程序。
Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。
通过这段时间对Scala的学习与实际项目中的使用,确实能感受到Scala的强大,简洁,函数式编程的魅力。
当然,我们也可以像Shell,Perl这些脚本语言,用Scala实现缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程。
一般先定义Scala脚本如下:
Script.scala:
object Script{
def main(args: Array[String]){
println("Hello World")
}
}
如下打开Scala控制台执行如下命令:
scala -cp . Script
可打印:
Hello World
我们今天主要不是讲Scala原生自带执行Scala脚本的方法,我们讲的是一个灵活执行Scala脚本的框架:Ammonite
之所以说它灵活,就是因为他不仅可以像Scala控制台命令里面执行脚本,还可以直接集成到代码里面执行脚本文件并返回结果给程序处理。
国内参考文档较少,还附上官网及源码:
官网地址:http://ammonite.io/
Github地址:https://github.com/lihaoyi/Ammonite
1. 下载安装方法
mkdir demo
cd demo/
wget https://github.com/lihaoyi/Ammonite/releases/download/1.1.2/2.12-1.1.2
mv 2.12-1.1. amm
chmod +x amm
vi amm
./amm
touch test1.sc
import $ivy.`mysql:mysql-connector-java:5.1.`
import $ivy.`com.github.wangzaixiang::scala-sql:2.0.`
import wangzx.scala_commons.sql._
val driverClassName="com.mysql.jdbc.Driver"
val url="jdbc:mysql://10.10.10.108:3358/finance?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true"
val username="root"
val password="today-36524"
val conn = java.sql.DriverManager.getConnection(url, username, password)
val rows = conn.rows[Row]("select * from t_invoice limit 10")
rows.foreach(println) ./amm test1.sc
2. 实际代码应用
1)引入Ammonite包
name := "db_report" version := "0.1" scalaVersion := "2.12.6" libraryDependencies ++= Seq(
"com.lihaoyi" % "ammonite_2.12.6" % "1.1.1"
)
2)编写Scala脚本
Test.sc
import ammonite.main.Router.{doc, main} @main
def main(x: Int@doc("this is x"), y:Int@doc("this is y")) = {
val result = x*y
println(result)
Map("key" -> result)
}
3)调用Scala脚本并返回结果
package com.today.dbreport import ammonite.ops.Path
import ammonite.util.Res
import ammonite.util.Res.{Exception, Failure, Success} object Test {
def main(args: Array[String]): Unit = {
val args = Seq(("x", Some("2")), ("y", Some("3")))
//运行Scala脚本并获取数据Map
val result: (Res[Any], Seq[(Path, Long)]) = ammonite.Main().runScript(Path("Test.sc"), args)
val dataMap = (result._1 match {
case Success(x) => {
Some(x.asInstanceOf[Map[String, AnyRef]])
}
case Failure(msg) => println(s"generate report by script failure: ${msg}"); None
case Exception(msg, e) => println(s"generate report by script exception: ${msg}", e); None
}) match {
case Some(x) => x
case None => Map()
} println(dataMap);
}
}
输出结果:
Compiling (synthetic)/ammonite/predef/interpBridge.sc
Compiling (synthetic)/ammonite/predef/DefaultPredef.sc
Compiling /home/barry/data/projects/db_report/src/main/resources/scripts/Test.sc Map(key -> )
Scala脚本化-Ammonite的更多相关文章
- 深入理解脚本化CSS系列第六篇——脚本化伪元素的6种方法
× 目录 [1]动态样式 [2]CSS类[3]setAttribute()[4]CSSRule对象添加[5]空样式覆盖[6]CSSRule对象删除 前面的话 我们可以通过计算样式来读取伪元素的样式信息 ...
- 深入理解脚本化CSS系列第四篇——脚本化样式表
× 目录 [1]CSSStyleSheet [2]CSSRule 前面的话 关于脚本化CSS,查询样式时,查询的是计算样式:设置单个样式时,设置的是行间样式:设置多个样式时,设置的是CSS类名.脚本化 ...
- 深入理解脚本化CSS系列第三篇——脚本化CSS类
前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接 ...
- 深入理解脚本化CSS系列第一篇——脚本化行内样式
× 目录 [1]用法 [2]属性 [3]方法 前面的话 脚本化CSS,通俗点说,就是使用javascript来操作CSS.引入CSS有3种方式:外部样式,内部样式和行间样式.本文将主要介绍脚本化行间样 ...
- (转)mongodb常用命令脚本化-自动化运维
mongodb常用命令脚本化-自动化运维 把一些运维中常用到的mongodb命令写成shell脚本,极大的方便了维护 1 设置副本集 #!/bin/bash#mongodb 进入client ...
- JavaScript 客户端JavaScript之脚本化HTTP(通过XMLHttpRequest)
XMLHttpRequest对象的设计目的是为了处理由普通文本或XML组成的响应:但是,一个响应也可能是另外一种类型,如果用户代理(UA)支持这种内容类型的话. 大多数浏览的客户端JavaScri ...
- JavaScript 客户端JavaScript之 脚本化浏览器窗口
1.计时器 客户端Javascript以全局函数setTimeOut().clearTimeOut().setInterval().clearInterval()提供这一功能. 前者是从运行的那一 ...
- JavaScript 客户端JavaScript之 脚本化文档
客户端JavaScript的存在把静态HTML转变为交互式的Web应用程序,脚本化Web页面的内容正是JavaScript存在的理由. 一个文档对象模型或者说DOM就是一个API,它定义了如何访问 ...
- 脚本化HTTP
1.HTTP: 定义:超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协 ...
随机推荐
- 新导入的eclipse项目报错,找不到java包,找不到web.xml文件报错。
新导入的项目可能会出现报错,特别是web项目.我这里提供一种解决方法: 1.右击项目,选择“属性” 2.选择 Resource->java build path->libraries 图中 ...
- 神奇的namespace使用
一大波概念正在来袭: 作用域与命名空间 相关概念 与命名空间相关的概念有: 声明域(declaration region)—— 声明标识符的区域.如在函数外面声明的全局变量,它的声明域为 ...
- 【python进阶】深入理解系统进程1
前言 之前程序执⾏都是⼀条腿⾛路,甚⾄是⽤⼀杆枪来打天下. 通过系统编程的学习,会让⼤家有“多条腿”⼀起⾛路,就好⽐有了⼀把机关枪. 此篇为深入理解进程第一篇,下面开始今天的说明~~~ 进程 多任务的 ...
- Java的精确整数计算-Bigdecimal学习总结和工具类
随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...
- day13_Mysql事务与数据库连接池学习笔记
一.Mysql事务 事务: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功(数据回滚). 例如:A给B转帐,对应于如下两条sql语句 : update account ...
- python_黑洞数
>>> def main(n): start = 10**(n-1)+2 end = start*10-20 for i in range(start,end): i = str(i ...
- vue国际化高逼格多语言
## 1.NPM 项目安装 ``` cnpm i vue-i18n ``` ## 2.使用方法 ``` /* 国际化使用规则 */ import Vue from 'vue' import VueI1 ...
- Pat1071: Speech Patterns
1071. Speech Patterns (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HOU, Qiming Peo ...
- POI处理Excel中各种日期格式问题
前不久写过一篇随笔<EXCEL解析之终极方法WorkbookFactory>,提到使用WorkbookFactory来处理Excel文件数据,最近发现一个问题就是这个办法不能很好的处理各种 ...
- Java中的queue和deque对比详解
队列(queue)简述 队列(queue)是一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则.Java中,LinkedList实现了Queue接口,因为LinkedLis ...