惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LangChain Blog
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
Microsoft Azure Blog
Microsoft Azure Blog
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
Hugging Face - Blog
Hugging Face - Blog
Y
Y Combinator Blog
D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements

smallyu的博客

为什么买的加密货币一定要去中心化 RISC-V 虚拟机无法代替 EVM 虚拟机 Polkadot 的 Existential Deposit 机制错在哪里 利息,套利,交易策略,金融市场 LayerZero 从来不挑战比特币的地位 默认参数引起的以太坊节点运行错误 硬件钱包与资产安全 预测市场比币圈更赌场 为什么去中心化的跨链桥不可能实现 我对于 AI 时代的答案 不要投资任何隐私币 区块链技术世界的三大真理 以太坊 AA 钱包的致命问题是什么 基于 AI 语义执行的 MCP 区块链的设计 一个集成 Geth 和 CometBFT 的兼容层 我的加密货币定投策略(二) DeFi 基础: 理解 AMM 定价机制 Go 语言 GMP 调度器的原理是什么 Web3 项目分析计划 对 Psyche Network 项目的分析 continuation 教程: 理解 CPS 如何开发一个比特币符文(Runes)协议 比特币脚本开发教程 我从王垠的计算机科学视频班学到了什么 区块链技术面试题(2025年版) Rust 语言容易让新手困惑的一个“过度优化” Solana 智能合约开发教程 (1) 尝试开发一个最小 EVM 虚拟机 基于 ZK 的链上身份系统设计 一个 Web3 打赏系统的设计
用 Scala 改写 Java 浅度实践
2018-12-14 · via smallyu的博客

2018-12-14

起源

想要用Java实现Markdown解析器,目前只完成了多级标题的解析。其实也就是正则匹配之后替换掉相应内容,程序暂时比较简单,大致流程如下:

改写

按照同样的流程,用Scala来实现该功能,之后也将使用Scala继续完成开发。首先读取文件内容,IO操作参考《Scala Cookbook》,只需一行代码即可:

var srcLines = Source.fromFile(srcFile).getLines().toList

与冗长的Java相比,Scala确实精简了不少。这是之前使用Java读取文件封装的方法:

/**
  * 读取文件内容
  *
  * @param src 读取文件路径
  * @return 读取文件内容
  */
private static String readFile(String src) throws IOException {
    StringBuffer content = new StringBuffer();
    InputStream is = null;
    BufferedReader reader = null;

    is = new FileInputStream(src);
    reader = new BufferedReader(new InputStreamReader(is));

    String line = reader.readLine();
    while (line != null) {
        content.append(line);
        content.append("\n");
        line = reader.readLine();
    }

    if (reader != null) {
        reader.close();
    }
    if (is != null) {
        is.close();
    }
    return content.toString();
}

至于Scala版本将字符串改为列表操作的原因在于,Scala和Java在使用正则匹配替换的API上有差异。Java使用Matcher对象进行迭代,Matcher对象拥有查找、替换等方法:

而Scala的Regex对象虽然拥有findAllMatchIn、replaceAllIn等方法,但在find中的对象仅用于查找,replace方法中又无法定位匹配项的内容。因此在Scala中,将文件读入列表,使用如下方式带索引遍历文本内容:

List.range(0, srcLines.size).foreach(index => {
  srcLines = srcLines.updated(index, regexReplace)
})

无论是否含有匹配项,循环内都对列表执行一次updated,更新原内容为正则替换后的内容。这样做可能稍微欠妥,关于性能问题将持续关注并整改。可以看到的是,Scala的程序思想与Java典型的OOP确实存在些许差异。

最后关于文件写入,SDK中没有提供专门的操作对象,可使用JDK中的PrintWriter:

val pw = new PrintWriter(new File(outFile))
pw.write(outString)
pw.close()

后续

“Scala是一门会伴随开发者成长的语言”,我将用它完成我的毕业设计。