Scala和Kotlin脚本编程

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Scala和Kotlin作为运行在JVM上的编程语言,解决了Java的很多痛点。今天我们来聊聊如何将Scala和Kotlin作为脚本语言使用(Java不支持以脚本形式运行哦)。

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
[这里有一个空行]

注意:

  1. Runtime.getRuntime().exec()函数中直接输入命令名称加参数组成的字符串
  2. ProcessBuilder使用多个参数进行命令名称和参数进行类的初始化
  3. 命令中的路径名称不能使用~特殊字符,否则会出错。建议使用全路径。
  4. Process.waitFor()等待调用的外部程序执行完毕再接着执行脚本后续代码。
  5. 从输出结果的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中为我们提供了更加便捷的方法来调用外部命令或程序,下面我们来看一下吧!

  1. 使用Process!方法,得到执行结果的状态码,一般0表示成功
  2. 使用Process!!方法,得到执行结果的文本输出
  3. 使用ProcesslazyLines方法,将得到保存在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脚本编程的异同

  1. Scala脚本的扩展名和执行方式和普通Scala类一样;Kotlin脚本的扩展名为kts,执行的时候需要加-script参数
  2. Scala提供了对于外部命令调用的快捷方法;Kotlin主要依靠Java类库进行外部命令调用
  3. 在IntelliJ IDEA中可以直接运行Kotlin脚本,但是不支持直接运行Scala脚本
  4. IntelliJ IDEA提供了对Ammonite项目的支持,可以运行Ammonite Scala脚本

注:Ammonite项目扩展了Scala的脚本功能,添加了很多额外的特性,甚至提供了一个基于Scala的Shell(类似于Bash Shell)。用Ammonite写的Scala脚本扩展名为sc,使用amm命令进行执行。感兴趣的童鞋可以去围观该项目。

目录
相关文章
|
6月前
|
Java 调度 Android开发
构建高效Android应用:探究Kotlin多线程编程
【2月更文挑战第17天】 在现代移动开发领域,性能优化一直是开发者关注的焦点。特别是在Android平台上,合理利用多线程技术可以显著提升应用程序的响应性和用户体验。本文将深入探讨使用Kotlin进行Android多线程编程的策略与实践,旨在为开发者提供系统化的解决方案和性能提升技巧。我们将从基础概念入手,逐步介绍高级特性,并通过实际案例分析如何有效利用Kotlin协程、线程池以及异步任务处理机制来构建一个更加高效的Android应用。
|
29天前
|
Web App开发 安全 Java
网页内容获取:Scala自动化脚本的实现
网页内容获取:Scala自动化脚本的实现
|
29天前
|
缓存 分布式计算 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
38 0
|
29天前
|
分布式计算 算法 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
43 0
|
3月前
|
Java Android开发 开发者
Kotlin 循环与函数详解:高效编程指南
高效编程实践 • 避免不必要的循环 - 尽量使用集合操作如 map、filter 来减少显式的循环。 • 使用尾递归优化 - 对于需要大量递归的情况,考虑使用尾递归以优化性能。 • 内联函数 - 对于传递 Lambda 表达式的函数,使用 inline 关键字可以减少运行时开销。 通过上述指南,您应该能够更好地理解 Kotlin 中的循环和函数,并能够编写更加高效和简洁的代码。Kotlin 的设计哲学鼓励开发者编写易于理解和维护的代码,而掌握循环和函数是实现这一目标的关键步骤。 如果您想了解更多关于 Kotlin 的循环和函数的信息,以下是一些官方文档和资源,它们可以提供额外的参考
48 1
|
3月前
|
Java Kotlin
Kotlin 循环与函数详解:高效编程指南
Kotlin中的循环结构让你能轻松遍历数组或范围内的元素。使用`for`循环结合`in`操作符,可以简洁地访问数组中的每个项,如字符串数组或整数数组。对于范围,可以用`..`来定义一系列连续的值并进行迭代。此外,Kotlin支持通过`break`和`continue`控制循环流程。函数则允许封装可复用的代码块,你可以定义接受参数并返回值的函数,利用简写语法使代码更加紧凑。例如,`myFunction(x: Int, y: Int) = x + y`简洁地定义了一个计算两数之和的函数。
48 1
|
4月前
|
Scala 开发者
Scala中的模式匹配与高阶函数:探索强大的编程范式
【7月更文挑战第11天】Scala中的模式匹配和高阶函数是两种极其强大的特性,它们不仅提升了代码的表达力和可读性,还使得开发者能够编写出更加灵活和可重用的解决方案。通过
|
6月前
|
安全 编译器 Scala
何时需要指定泛型:Scala编程指南
本文是Scala编程指南,介绍了何时需要指定泛型类型参数。泛型提供代码重用和类型安全性,但在编译器无法推断类型、需要提高代码清晰度、调用泛型方法或创建泛型集合时,应明确指定类型参数。通过示例展示了泛型在避免类型错误和增强编译时检查方面的作用,强调了理解泛型使用时机对编写高效Scala代码的重要性。
43 1
何时需要指定泛型:Scala编程指南
|
JSON 分布式计算 算法
Spark-编程进阶(Scala版)
Spark-编程进阶(Scala版)
|
存储 缓存 分布式计算
Spark RDD编程基础(Scala版)
Spark RDD编程基础(Scala版)