JavaRush /Java 博客 /Random-ZH /KotlinRush:继续用 Java 编写有意义吗?
NikEy
第 41 级
Новосибирск

KotlinRush:继续用 Java 编写有意义吗?

已在 Random-ZH 群组中发布
你好,JavaRush 同学,在你完全被 Java 吸引之前,我想拓展你的视野,让你关注日益流行的Kotlin语言!
KotlinRush:继续用 Java 编写有意义吗? - 1
Kotlin 是由JetBrains开发的一种相当年轻的语言。是的,是的,正是这家公司开发了我们最喜欢的 IDE:IntelliJ IDEA。Kotlin 是一种 JVM 语言,与 Java 完全兼容,也就是说,从 Kotlin 代码中您可以轻松访问熟悉的 Java 库。库呢:Kotlin 和 Java 类可以共存于一个包中!Kotlin 在编程社区中非常受欢迎,以至于 Google 承认它为 Android 的官方开发语言,最近 Kotlin 也开始在企业项目中受到欢迎。在这篇文章中,我想给出几个用 Kotlin 和 Java 编写的代码的比较示例,并得出一些结论。去! 像往常一样,让我们​​从“Hello World”开始
// Java
public class Application {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
// Kotlin
class Application
fun main(vararg args: String) {
    println("Hello World!")
}
看看 Kotlin 示例,我们可以立即注意到以下几点:
  • 无需在行尾写分号;
  • 所有方法均由fun关键字描述;
  • 要打印一行,只需一个单词就足够了 - println()
创建实例
// Java (до 10)
final Application application = new Application();
// Kotlin
val application = Application()
科特林差异:
  • 如果从实例中可以清楚地看出变量的类型,则无需声明变量的类型;
  • 而不是变量类型 - val(不可变)或var(可变);
  • 您不需要编写new关键字来创建实例!
方法说明
// Java
public int sum(int a, int b) {
    return (a + b);
}
// Kotlin
fun sum(a: Int, b: Int): Int {
return (a + b)
}
科特林差异:
  • 如果方法需要返回某些内容,则在签名中添加“ : Int ”,其中Int是返回类型;
  • 方法参数说明:先是变量名,然后是类型;
  • 由于方法体仅由一行组成,因此您可以省略return
    fun sum(a: Int, b: Int): Int = (a+b)
格式化字符串输出
// Java
public int sum(int a, int b) {
    int result = (a + b);
    System.out.printf("Сумма %d и %d равна %d\n", a, b, result);
    return result;
}
// Kotlin
fun sum(a: Int, b: Int): Int {
    val result = (a + b)
    println("Сумма $a и $b равна $result")
    return result
}
Kotlin 支持字符串插值,只需在变量开头使用“$”符号即可。这种表示法显着提高了代码的简洁性和可读性。 实例对比
// Java
object1.equals(object2)
// Kotlin
object1 == object2
在 Kotlin 中,对象类型的比较“ ==”被翻译为equals! 为了比较链接,===使用“”。 例外情况
// Java
public List<String> getFileContent(String file) throws IOException {
    Path path = Paths.get(file);
    return Files.readAllLines(path);
}
// Kotlin
fun getFileContent(file: String): List<String> {
    val path = Paths.get(file)
    return Files.readAllLines(path)
}
Kotlin 中没有检查异常;现在您不需要在整个应用程序中无休止地抛出异常或创建多级异常try-catch空安全
// Java
public class Data {
    String value;

    String render() {
        if (value == null) {
            return "Value: undefined";
        } else {
            return "Value:" + value.toUpperCase();
        }
    }
}
// Kotlin
class Data {
    var value: String? = null
    fun render(): String =
            "Value: ${value?.toUpperCase() ?: "undefined"}"
}
Kotlin 解决了 NPE 问题并引入了一些要求:
  • 所有类字段和变量都必须初始化;
  • 您可以在字段或变量中写入“null”,但是您必须明确表示您的变量是可为空的(写入“?”符号);
  • Elvis 运算符“?:”的工作原理如下:如果左侧为 Null,则取右侧的值。在我们的示例中,当value变量未初始化时,将采用值“ undefined ”。
类字段和对它们的访问
// Java
public class Data {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
class App {
    void execute() {
           Data data = new Data()
           data.setValue("Foo")
     }
}
// Kotlin
class Data {
    var value: String = ""
}
class App {
    fun execute() {
          val data = Data()
          data.value = "Foo" // Под капотом выполнится data.set("Foo")
     }
}
在 Kotlin 中,简单地描述一个字段就足够了:它已经有了隐式的 getter 和 setter (hello lombok ),如果需要的话可以随时重写。同时,我们只需直接访问该字段即可读取和修改该字段的值,并在幕后调用它get()|set()周期
// Java
void example() {
    for(int i = 1; i <= 10; i++) {
        System.out.println(i);
    }

    for(String line : "a,b,c".split(",")) {
        System.out.println(line);
    }
}
// Kotlin
fun example() {
    for(i in 1..10) {
        println(i)
    }

    for(line in "a,b,c".split(",")) {
        println(line)
    }
}
Kotlin 为遍历序列提供了方便且统一的语法:只需在左侧使用一个变量,在右侧使用一个序列,中间使用关键字“ in ”,类型由内容自动确定。 辛格尔顿
// Java
public class Singleton {
    private static Singleton ourInstance = new Singleton();

    public static Singleton getInstance() {
        return ourInstance;
    }

    private Singleton() {
    }
}
class App {
    void execute() {
         Singleton singleton = Singleton.getInstance()
    }
}
// Kotlin
object Singleton {}

class App {
    fun execute() {
          val singleton = Singleton
    }
}
熟悉的“单例”模式在实践中经常使用,因此 Kotlin 决定创建一个单独的关键字“ object ”,它代替“ class ”而编写,意味着该类是单例;使用时,您甚至不需要需要调用构造函数或任何其他方法! 命名方法参数和默认值
// Java
void setStatus(String code) {
    setStatus(code, "");
}

void setStatus(String code, String desc) {
    this.code = code;
    this.desc = desc;
}
// Kotlin
fun setStatus(code: String, desc: String = "") {
    this.code = code;
    this.desc = desc;
}

fun execute() {
    setStatus("200")
    setStatus(code = "200", desc = "Ok")
}
碰巧,并非方法或构造函数中的所有参数都必须是必需的,并且在 Java 中,我们习惯于为每种可能的参数组合创建一组方法或构造函数。Kotlin 中引入了默认参数,它允许您声明 1 个方法,并根据情况向其传递所需的参数集。
// Java
String getFirst(List<String> strings, String alpha) {
    return strings.stream()
            .filter(x -> x.startsWith(alpha))
            .findFirst()
            .orElse("");
}
// Kotlin
fun getFirst(strings: List<String>, alpha: String): String {
    return strings.first { it.startsWith(alpha) }
}
Java 8 中流的引入已成为处理集合时不可或缺的功能。在 Kotlin 中,流变得更加方便和实用:每个集合都已经拥有一组方便且常用的数据处理方法。另外,请注意第一个方法内的 lambda 表达式:如果函数文字只有一个参数,则可以删除其声明(与 -> 一起),并引用为 it是时候结束了…… 我只演示了功能的一小部分,但我确信您已经想尝试 Kotlin 了!根据我的经验,我可以得出以下结论:
  • 对于 Java 开发人员来说,掌握 Kotlin 语法并开始编写代码非常容易;
  • Kotlin 与 Java 完全兼容,您已经可以在现有项目中尝试它,例如在测试中;
  • Kotlin 代码更干净、更具可读性,你不需要写一堆样板文件
  • IDEA 有一个自动 Java 到 Kotlin 转换器,您可以将现成的 Java 代码自动转换为 Kotlin;
  • 一个新的项目需要用Kotlin来编写,因为从基础设施的角度来看它和Java是一样的,但是在使用方面它更好更方便!
如果您喜欢这篇文章并且通常与有关 Java 的资源相关,我可以继续撰写有关在实际企业项目中使用 Kotlin 的经验。 有用的链接:
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION