关键词:
文章目录
版权声明:本文为博主原创文章,转载请注明原文出处!
作者:阿振
写作时间:2020-05-05 五一假期末
Scala和Kotlin脚本编程
Scala和Kotlin作为运行在JVM上的编程语言,解决了Java的很多痛点。今天我们来聊聊如何将Scala和Kotlin作为脚本语言使用(Java不支持以脚本形式运行哦)。
Kotlin脚本编程
Kotlin脚本的扩展名为kts
,运行命令为kotlinc -script <脚本文件名.kts>
HelloWorld示例
下面我们来看一个HelloWorld示例:
新建名称为Main.kts
的Kotlin脚本文件,内容如下:
println("你好 $if (args.isNotEmpty()) args[0] else ""!")
可以看到脚本程序不需要主函数,Kotlin脚本以args
参数接收用户输入(args是一个Array<String>
类型的数组)
在命令行执行:kotlinc -script Main.kts 高寒
得到脚本运行结果为:你好 高寒!
调用外部命令
如果我们想在Kotlin脚本中调用外部的命令或者程序需要怎么做呢?
使用Java API中提供的Runtime.getRuntime().exec()
函数或者ProcessBuilder
类创建一个Process
对象调用外部命令。
下面以调用系统ls
命令作为示例程序进行演示说明。
import java.lang.Runtime
val process: Process = Runtime.getRuntime().exec("ls /Users/TheOneGIS/Desktop")
process.waitFor()
process.inputStream.reader().use
println(it.readText())
或者
import java.lang.ProcessBuilder
val process: Process = ProcessBuilder("ls", "/Users/TheOneGIS/Desktop").start()
process.waitFor()
process.inputStream.reader().use
println(it.readText())
在命令行中执行kotlinc -script Main.kts
,输出结果如下:
11
data
raw
[这里有一个空行]
注意:
Runtime.getRuntime().exec()
函数中直接输入命令名称加参数组成的字符串ProcessBuilder
使用多个参数进行命令名称和参数进行类的初始化- 命令中的路径名称不能使用
~
特殊字符,否则会出错。建议使用全路径。 Process.waitFor()
等待调用的外部程序执行完毕再接着执行脚本后续代码。- 从输出结果的InputStream中得到文本输出,可以看到最终的文本输出每一行之后都会增加一个换行符。
Scala脚本编程
Scala脚本的扩展名仍为scala
,运行命令为scala <脚本文件名.scala>
,和普通的Scala类一样。
HelloWorld示例
新建名称为Main.scala
的Scala脚本文件,内容如下:
println(s"你好 $if (args.nonEmpty) args(0) else ""!")
可以看到和Kotlin脚本程序一样不需要主函数,Scala脚本同样以args
参数接收用户输入(args是一个Array[String]
类型的数组)
在命令行执行:scala Main.scala 高寒
得到脚本运行结果为:你好 高寒!
调用外部命令
在Scala中可以调用Java方法,我们可以直接使用上面类似Kotlin的方式,但是Scala中为我们提供了更加便捷的方法来调用外部命令或程序,下面我们来看一下吧!
- 使用
Process
的!
方法,得到执行结果的状态码,一般0表示成功 - 使用
Process
的!!
方法,得到执行结果的文本输出 - 使用
Process
的lazyLines
方法,将得到保存在LazyList[String]
结构的输出中(延迟执行)
注意:这里的Process
类是Scala类库中提供的,前面在Kotlin中使用的Process
类是Java类库中提供的。
我们先来看第一种方式:
import sys.process._
Process("ls /Users/TheOneGIS/Desktop").!
在命令行中运行scala Main.scala
,得到执行结果:
11
data
raw
Process
的!
方法是有返回值的,这里我们直接舍弃了,并不关心ls
的返回值,我们只关心ls
命令的输出结果。
再看第二种方式:
import sys.process._
val results = Process("ls /Users/TheOneGIS/Desktop").!!
println(results)
在命令行中运行scala Main.scala
,得到执行结果:
11
data
raw
[这里有一个空行]
可以看到results
字符串是给ls
命令的每个输出字符后面都加了换行符。
再看第三种方式:
import sys.process._
val results = Process("ls /Users/TheOneGIS/Desktop").lazyLines
results.foreach(println)
输出结果和第一种方式一样,不过当需要获取最后输出并且需要对输出进行操作的时候我最喜欢使用第三种方式,不需要对输出进行进一步处理的时候我喜欢使用第一种方式。
Scala和Kotlin脚本编程的异同
- Scala脚本的扩展名和执行方式和普通Scala类一样;Kotlin脚本的扩展名为
kts
,执行的时候需要加-script
参数 - Scala提供了对于外部命令调用的快捷方法;Kotlin主要依靠Java类库进行外部命令调用
- 在IntelliJ IDEA中可以直接运行Kotlin脚本,但是不支持直接运行Scala脚本
- IntelliJ IDEA提供了对Ammonite项目的支持,可以运行Ammonite Scala脚本
注:Ammonite项目扩展了Scala的脚本功能,添加了很多额外的特性,甚至提供了一个基于Scala的Shell(类似于Bash Shell)。用Ammonite写的Scala脚本扩展名为sc
,使用amm
命令进行执行。感兴趣的童鞋可以去围观该项目。
jvm上数据处理语言的竞争:kotlin,scala和spl(代码片段)
基于JVM的开源数据处理语言主要有Kotlin、Scala、SPL,下面对三者进行多方面的横向比较,从中找出开发效率最高的数据处理语言。本文的适用场景设定为项目开发中常见的数据处理和业务逻辑,以结构化数据为主&... 查看详情
jvm上数据处理语言的竞争:kotlin,scala和spl(代码片段)
基于JVM的开源数据处理语言主要有Kotlin、Scala、SPL,下面对三者进行多方面的横向比较,从中找出开发效率最高的数据处理语言。本文的适用场景设定为项目开发中常见的数据处理和业务逻辑,以结构化数据为主&... 查看详情
jvm上数据处理语言的竞争:kotlin,scala和spl(代码片段)
🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅✒️个人主页:小鹏linux💊个人社区:小鹏linux(个人社区)欢迎您的加入!... 查看详情
通过groovy来消除代码噪声(代码片段)
...很多其他基于JVM的语言,比如Groovy,Scala,JRuby,Jython,Kotlin等等。其中,Groovy和Scala现在在Java社区中已经被广泛采用并大受欢迎。本文介绍如何在SpringBoo中使用Groovy语言来编程。GroovyGroovy是一种基于Java的语法的基于JVM的编程语... 查看详情
kotlin语法学习(代码片段)
文章目录Kotlin语法学习(二)面向对象编程类和对象继承和构造函数接口访问修饰符数据类和单例Kotlin语法学习(二)面向对象编程类和对象创建一个Person类openclassPerson/***姓名*/varname=""/***年龄*/varage=0/***人的吃饭方法*/fune... 查看详情
scala函数式编程(代码片段)
Scala函数式编程什么是函数式编程?1、函数式编程将计算视为数学上的函数计算2、函数成为了和普通的值一样的"头等公民",可以像任何其他数据类型的值一样被传递和操作函数式编程成为越来越流行的编程范式1... 查看详情
scala编程之伴生对象(代码片段)
伴生对象是scala中静态的概念Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在Scala中没有静态的概念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,我们称之... 查看详情
scala基础(代码片段)
scala是一门多范式的编程语言,一种类似java的编程语言,以JVM为目标环境,将面向对象和函数式编程有机的结合在一起应用:spark大数据开发 1、声明值和变量关键字val和varval定义的值是常量,不可改变;var定义的是变量,可... 查看详情
1.初识scala(代码片段)
...通用编程语言,既可用于大规模应用程序开发,也可用于脚本编程。 Scala由MartinOdersk于2001开发,2004年开始程序运行在JVM与.Net平台之上,由于其简洁、优雅、类型安全的编程模式而受到关注。 在Scala的创建之初 查看详情
scala简介(代码片段)
...言特点2.Scala程序和Java程序对比2.1程序的执行流程对比2.2代码对比1.Scala简介1.1概述Scala(斯嘎拉)这个名字来源于"ScalableLanguage(可伸缩的语言)",它是一门基于JVM的多范式编程语言,通俗的说:**Scala是一种运行在JVM上的函数式的面... 查看详情
01scala介绍与安装(代码片段)
01、Scala介绍与安装1.1Scala介绍Scala是对java语言脚本化,特点是就是使不具备脚本化的java语言能够采用脚本化方式来使用,使其具有脚本语言简单、所见即所得的特点,并且编程效率高,实现速度快等特点。在大数据领域中,Spark... 查看详情
spark入门知识讲解和基础数据操作编程(统一用scala编程实例)(代码片段)
在我的上一篇博文中:http://blog.csdn.net/zfszhangyuan/article/details/52538108 讲如何应用scala编程完成用户的在线时长和登录次数在spark上的求解方式。讲到这里有同学可能对编程完后如何将程序放到线上spark集群上运行以及如何理解s... 查看详情
《kotlin核心编程》笔记:函数和lambda表达式(代码片段)
... 以其他函数作为参数或返回值的函数” 。函数类型在Kotlin中,函数类型的格式非常简单,举个例子: 查看详情
scala函数式编程函数式的数据结构下(代码片段)
...合和函数Scala函数式编程(四)函数式的数据结构上1.List代码解析今天介绍的内容,主要是对上一篇介绍的scala函数式数据结构补充,主要讲代码。可以先看看上一节,主要讲的是函数式的list,Scala函数式编程(四)函数式的数... 查看详情
scala笔记整理:函数式编程(代码片段)
[TOC]作为值传递的函数测试代码如下:packagecn.xpleaf.bigdata.p4.function/***scala中关于函数的操作*/object_01FunctionOpsdefmain(args:Array[String]):Unit=functionOps1/***作为值传递的函数*将一个函数作为值传递给另外一个函数变量的时候,约定需要在... 查看详情
scala笔记整理:scala基本知识(代码片段)
...。Scala运行在Java虚拟机上,并兼容现有的Java程序。Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。函数编程范式更适合用于Map/Reduce和大数据模型,它摒弃了数据与状态的计算模型,着眼于... 查看详情
scala安装和开发环境配置教程(代码片段)
...式编程的静态语言,java语言是面向对象的,所以代码写起来就会相对比较模块儿,而函数式编程语言相对比较简洁。发展过程 查看详情
scala基础(代码片段)
Scala基础Scala是一门类似Java的多范式语言,集合了面向对象编程和函数式编程的特性。使用Scala语言编写Spark应用程序的考虑:1)Scala具有强大的并发性,支持函数式编程,可以更好的支持分布式系统。在大数... 查看详情