Kotlin logo

Kotlin

A concise multiplatform language developed by JetBrains

面向 Java 开发者的 Kotlin 使用入门

Read this post in other languages:

客座文章作者:Urs Peter,高级软件工程师兼 JetBrains 认证 Kotlin 培训师。 对于希望以更系统的方式提升 Kotlin 技能的读者,Urs 还在 Xebia Academy 主办了 Kotlin 技能提升计划

本文为在以 Java 为主的环境中成功采用 Kotlin 的终极指南系列课程的开篇,课程将从一位开发者产生好奇心到在公司范围内实现转型这一发展过程,逐步讲述 Kotlin 如何在真实团队中得到应用。


转型采用 Kotlin 并非一蹴而就之事。

排除风险、审慎评估、收获成效,

然后再加倍投入。

在成熟的 Java 环境中采用 Kotlin 不仅仅是一项技术决策,而是一个需要精心计划、战略思考,最重要的是赢得同事们支持和理解的过程。 

在培训超过 1000 名开发者并帮助众多组织成功过渡到 Kotlin 之后,我见证了哪些方式有效,哪些无效。 本指南将带您了解我多年来收集的 Kotlin 成功采用案例,从您的第一个实验性演练场到大规模的组织转型。

本系列课程将带您经历以下旅程:

转型星火,由您引燃!

转型星火,由您引燃!

为什么要花精力转换到 Kotlin? 为何不沿用 Java 呢? 

答案取决于多种因素。 虽然数据可以清楚表明 Kotlin 在多个领域都颇具优势,但决策并非纯粹出于技术层面。 人们的主观偏好(“我喜欢我的语言,无需理由”)以及对新事物的怀疑态度(这通常是一件好事)发挥着重要作用。 

不过,编程语言的发展历程表明,我们的偏好和需求会随着时间而改变。 至关重要的是,每一代新语言都融入了新的范式(null 安全、简洁轻量化语法、函数作为一等公民、丰富的标准库、异步并发、多平台支持、生成式 AI 友好等),这些都会为开发者和组织带来决定性优势。 

如果未经历这种自然发展,我们现在可能仍在用 COBOL 或其他古老语言编写所有代码,势必无法满足当今的需求。 因此,进化并非可有可无,而是我们行业的历史必然。

然而,如果只是技术上的优势,还不足以让这种变革在公司内部扎根。 这需要推动者 – 愿意探索、倡导并在实践中展现这些新范式价值的人。 根据我的经验,通常有三种类型的工程师会成为采用 Kotlin 的催化剂:

  1. 务实、注重效率的 Java 工程师:将 Java 视为工具而非信仰的经验丰富且的开发者。 他们一直在寻找能够更快完成工作的更好方式。
  2. 注重质量的现代语言爱好者:注重代码可读性、简洁性和可维护性的工程师。 他们往往也是曾经会向 Scala 转型的人。
  3. 初级开发者:会提出简单而直击要害的问题的新手:“如果可以使用 Kotlin,为什么还要使用 Java 呢?” 对于没有多年 Java 经验包袱的开发者来说,Kotlin 通常是一个不二之选。

您属于哪个群体? 

这些早期采用者点燃了进入第一阶段的星火。 但该如何开始呢? 请继续阅读… ;-) 

试用阶段:从小规模测试开始。

您听说过 Kotlin,想尝试一下,但又不想立即投入使用。 

那么,您首先需要的是一款能够播下第一粒 Kotlin 种子的开发者工具。 这里有一些选项:

  • https://play.kotlinlang.org/ 是一个很棒的在线演练场,只需输入并运行 Kotlin 代码即可,不仅可以在 JVM 上运行,还可以在各种其他平台(JS、WASM 等)上运行。Kotlin Playground
  • Kotlin Notebook 是 IntelliJ IDEA 的一项强大功能,可让您轻松导入依赖项、执行代码,甚至处理数据、绘制图表等。 以下示例展示了使用 Spring 的 RestClient 进行 REST 调用有多轻松:Kotlin Notebook
  • IntelliJ IDEA 提供了对 Kotlin 的一流支持。 这不足为奇,因为 JetBrains 是 Kotlin 的创造者,而 IntelliJ IDEA 的大部分代码都是用 Kotlin 编写的。 那就开始在 IntelliJ IDEA 中使用 Kotlin 吧 – 即使在您现有的 Java 项目中,也轻而易举:
    • 对于 Maven,只需配置 kotlin-maven-plugin 和 Kotlin 标准库 kotlin-stdlib 即可。
    • 对于 Gradle,您需要配置 Kotlin 插件。

…可以开始了!

  • 还有更多! JetBrains 最近发布了 Kotlin 语言服务器,为 IntelliJ IDEA 以外的其他 IDE(例如 VS Code)带来功能齐全的 Kotlin 开发体验。 请参阅:https://github.com/Kotlin/kotlin-lsp 

现在,您可以在您喜欢的开发环境中编写 Kotlin 代码。 如何在真实环境中以最小的影响和最高的洞察力评估语言? 在现有 Java 项目的测试套件中! 

这种安全且实际的 Kotlin 实验方式具有以下几项优势:

  • 低风险:测试不会影响生产代码。
  • 学习机会:您可以在熟悉的环境中探索语言功能。
  • 循序渐进地引入:团队成员可以在没有压力的情况下熟悉 Kotlin 语法。

提示

  1. 尝试 Kotest + MockK:立即感受 Kotlin 测试 DSL(领域特定语言)的表达能力,例如功能丰富的断言 (shouldHaveSize(...)、中缀 (value shouldBe 1) 等。
  2. 使用简洁而强大的 Kotlin 集合,而非 Java 流。
  3. 体验各种语言功能,例如可为 null 的类型、析构、不可变性(valdata classes)、表达式构造(whentry-catchif else)等。

您将得到:

Java

@Test
void shouldGetAverageRating() {
   when(productRepository.findAll()).thenReturn(products);

   Map ratings = productService.averageRatings();

   assertAll(
           () -> assertThat(ratings).hasSize(4),
           () -> assertEquals(ratings, products
                   .stream()
                   .collect(Collectors.groupingBy(
                           Product::getName,
                           Collectors.flatMapping(
                                   p -> p.getRatings()
                                    .stream()
                                    .mapToDouble(Integer::doubleValue)
                                    .boxed(),   
                              Collectors.averagingDouble(Double::doubleValue)
                           )))
           )
   );
   verify(productRepository).findAll();

}

Kotlin

@Test
fun `should get average rating`() { //descriptive tests using ``
   every { productRepository.findAll() } returns products

   val ratings = productService.averageRatings()

   assertSoftly(ratings) { 		//powerful testing DSLs (Kotest)
       shouldHaveSize(4)
       this shouldBe productRepository.findAll()
           .groupBy { it.name }   			//concise collections
           .mapValues { (_, products) -> 		//destructuring
                  products.flatMap { it.ratings }.average() }
   }
    verify { productRepository.findAll() }
}

系列课程后续内容

Kotlin 的采用通常始于个人探索和一些用于验证实用性的测试。 这些初步探索将自然而然地引向更远大的目标:在实际项目中评估 Kotlin。

本系列课程的下一篇文章将介绍该阶段,并说明如何在生产环境中测试 Kotlin。

Urs Peter

Urs 是一位经验丰富的软件工程师、解决方案架构师、会议演讲嘉宾和培训师,在构建弹性、可扩缩和任务关键型系统方面拥有 20 余年的丰富经验,主要涉及 Kotlin 和 Scala。

除了担任顾问之外,他还是一位充满热情的培训师,并撰写了丰富多样的课程,涉及从 Kotlin 和 Scala 语言课程到微服务和事件驱动型架构等架构培训的众多内容。

作为天生社交达人,他喜欢在聚会和会议上分享知识,启发同行并获得同行启发。 Urs 是一位 JetBrains 认证 Kotlin 培训师。

image description

Discover more