java 指令重拍
在一月份,我写了一篇文章,介绍了一些我希望在Java语言中看到的变化,这些变化会让我更加喜欢它(并使它变得更现代)。 很多人建议使用许多JVM语言,但我很大程度上不予理会,因为这不是我想要的。 我希望Java在这些方面有所不同,因为我不太可能说服工作场所让我使用Java以外的东西。 此外,建议的大多数JVM语言都具有一些语法思想,这些思想很难为我所理解。
但…
但是,后来我找到了Kotlin。 它是由IntelliJ,PyCharm和其他一些IDE和工具的创建者JetBrains制造的JVM语言。 在大多数情况下,我觉得这些家伙读懂了我想从我的语言中得到什么。 他们错过了我的帖子中的一些内容,但是却有很多我忘记或什至没有想到的内容。
与我的旧清单比较
首先,我们将把他们做了什么和不需要做的事情与我以前的帖子中的列表进行比较。
摆脱分号
Kotlin并非没有分号,但是在极少数情况下需要它们。 在大多数情况下,您可以在行尾省略分号。
卸下花括号
可悲的是,他们没有这样做。 我住
运算符重载
是的,他们有很多操作员重载。 与Python不同的是,它们具有递增和递减运算符,正负标记和否定运算符(例如python的__bool__()
,但具有自动转换功能;相反,它们还具有用于创建一系列对象的运算符( 1..3
),但两个数字在Kotlin中都应包含在内,尽管通常更易于阅读,但在很多时候都可以进行更多的中间计算,这就是为什么许多语言都希望将末尾包括在内。
最后,您定义自己的“运算符”,但它们必须是布尔值中缀运算符。 实际上,您没有定义自己的运算符,因为在使用一个参数调用方法时,该语言提供了一点语法上的好处。 对象a的任何方法md (通过参数b调用)(即a.md(b)
)都可以更简单地写为a md b
。
元组和/或数据结构
从某种意义上说,Kotlin同时具有这两种功能,但从某种意义上讲,两者都没有。
它们有一个名为Pair
的类,可以用作2元组,并且它们有一个很好的语法糖系统,可以将任何类基本上也转换为已命名的元组。 您可以通过字段的位置或字段名称来引用它们。 有关更多信息,请查看其有关Multi-Declarations的文档。
至于数据结构,他们采用了带有属性的类路由,这很好而且很花哨。 但是,关于它们的数据结构类的真正好处是定义它们的简单性。 一个示例声明是data class User(val name: String, val age: Int)
。 这不仅为您设置了所有属性,而且还自动定义了equals()
, hashCode()
, toString()
(形式为"User(name=John, age=42)"
))和一个特殊的copy()
功能,这是所讨论此处 。
物产
Kotlin当然具有属性。 实际上,使用属性比拥有简单的公共字段要容易。 它们的属性为您自动创建后备字段,其名称与属性相同,但下划线开头。
默认为public
说到方法,情况就是这样,我很高兴。 好极了!
类型对象
是的,他们已经删除了对原语的直接访问权限,并且您仅使用类型对象(由于使用了空安全措施,因此它比平时更安全,我将在稍后介绍。
列表,字典和集合文字
Ko,Kotlin没有收集集合文字。 令人遗憾的是,但是,借助Kotlin的某些功能,您可能会创造出非常简单的方法来内联他们的创作。
我忘记的事情
这些是我知道我想用Java编写的几件事,但是忘了放在旧帖子中
控制流表达式
当可以将一种语言中的控制流结构制成表达式(返回值)时,我喜欢它。 当然,Java(和许多其他语言)具有三元运算符,可以将if-else块视为一种表达式,但仅限于单个“ if”检查。 它不允许没有其他难以理解的嵌套的“ else if”块。
但是Kotlin不会因为if块而停下来。 它们还执行try-catch表达式和“ when”表达式(在下一节中说明)。 使用try-catch作为表达式时,您可以缩短一些需要在计算周围使用try-catch块的分配。 所以代替
Integer a;
try
{a = Integer.parseInt(input);
}
catch(NumberFormatException e)
{a = null;
}
你可以输入
Integer a = try { Integer.parseInt(input); } catch (NumberFormatException e) { null; }
显然,您不需要将它们用作表达式。 您仍然可以按自己想要的方式使用它们。
模式匹配
之前提到过“ when”表达式,但是现在我们真的要深入探讨了。它在Kotlin中用于模式匹配,并使用更简化的语法替换了switch-case块,这些语法也可以像if-else表达式一样工作,但用途更广泛。 它可以与切换块类似地起作用,因为它可以继续到下一个“ case”,但是必须使用显式的continue
命令来完成(现在大约是时候“ switch”的默认设置为不继续流动,但即使这样也不行)不需要那么多的东西,因为您可以简单地用逗号分隔多个可能性,使所有可能性都采用同一分支。请在此处查看 。
它不是某些功能语言定义的模式匹配,但据我所知,这是您可以在OO语言中做到的最好的选择。 我也伤心地报告说,尽管有体面的模式匹配,这是伟大的递归函数,Kotlin似乎并不具有尾调用优化。 然而(?)。 Kotlin还很年轻。 也许它将使它落在某处。
类扩展
无检查异常
我当然不介意抛出可能的异常的声明,也许是编译器警告让我们知道我们没有在处理或声明可能的异常被抛出,但是我当然不想被强迫“处理”。 ”实际上不会引发的异常。 所以,我很高兴Kotlin没有任何东西。
命名和默认参数
当您可以为参数使用默认值时,重载函数几乎是没有意义的;当参数的含义不明显时,能够在传递参数时命名参数可以使函数调用更加容易。
我从未意识到的事情
现在,我将列出Kotlin提供的一些最酷的东西,我什至从未意识到这是一个好主意。
空安全
除非对象的类型明确声明其为null,否则不能将其设置为null。 在Kotlin中, List
类型的对象不能为null,但是,如果它是List?
类型的List?
, 它可以。 这以及一些简单的语法使您可以安全地处理可为空的对象,从而使语言变得更加令人愉悦,几乎消除了NPE的可能性。
作为表达式的功能
这不是一个大问题,但是它可以减少简单的功能,以清晰的方式占用更少的空间。 如果函数的主体只是一个表达式(无论是简单表达式还是“ when”表达式之类的复杂表达式),则可以跳过主体周围的花括号,而在其前面加上=
。 例如:
fun powerOf(number: Int, exponent: Int): Int
{return Math.pow(number, exponent)
}
可以改为:
fun powerOf(number: Int, exponent: Int): Int = Math.pow(number, exponent)
这没什么大不了的,但是我喜欢它不仅可以让您切换大括号=
,而且还可以让您跳过对return语句的使用。
奥托罗
所以,这就是我对Kotlin的爱。 您应该在他们的官方页面上查看一下,并告诉我您的想法。 我对此感到非常兴奋,并计划在完成当前项目后切换到该项目,您可以期待下周在我的帖子中听到一些信息。
翻译自: https://www.javacodegeeks.com/2015/03/i-found-my-java-remake.html
java 指令重拍