百度
360搜索
搜狗搜索

kotlin lambda表达式,现代编程语言那些让人激动的特性详细介绍

本文目录一览: Kotlin带接收者的lambda表达式

在学习kotlin协程原理的时候发现了一个比较有意思的东西:
这个block参数的类型是:
suspend是一个关键字,在协程里面用于声明挂起函数,我们先忽略。看后面的 CoroutineScope.() -> Unit 看起来像是个函数类型,但是比起一般的函数类型又多了前面的” CoroutineScope. “前缀。
这玩意学名叫做 带有接收者的函数类型 ,通过文档我们可以知道它和 扩展函数 类似,允许在函数体内部访问接收者对象的成员。也就是说在lambda内部,传给调用的接收者对象成为隐式的this,我们可以用this去访问它的成员变量。这个时候invoke的第一个参数就是接收者也就是this的值:
然后this也可以省略:
通过kotlin的语法糖我们可以将invoke省略,将with方法写成下面的形式:
由于block的接收者是Person类型的,通过"Person.()->Unit"这个类型声明,其实我们可以将它看成Person的拓展函数,通过person这个传入的对象去调用,也就是说我们可以将with方法再改成这样的形式:
对kotlin熟悉的同学可能想到了,如果将特定的Person类型改成泛型,然后再将block的返回值返回,就是我们常用的with函数的实现原理:
如果with方法是Person的成员方法,那么输入的person接收者就是this,可以不用特地在方法参数指定。也就是说可以把它去掉写成下面的形式:
这个时候就更像给Person类创建了一个拓展方法。接收者是this,这个this就是我们传入的person变量。然后this同样可以省略,写成下面的形式:
如果我们使用泛型去替代这个特定的Person类,然后将this再返回,就是apply方法的实现原理了:
很多的kotlin DSL就是用上面的带有接收者的lambda函数去实现的,例如anko。我们可以先给ViewGroup声明一个拓展方法textView用于创建TextView添加成子view,然后TextView作为接收者去调用lambda方法block:
然后再声明一个Activity的拓展方法verticalLinearLayout用于创建垂直布局的LinearLayout,然后将这个创建的LinearLayout作为接收者去调用lambda方法block:
所以就有了下面这样的写法,创建一个垂直布局的LinearLayout里面包含两个TextView:
我们对这个dsl进行详细的解析,第一步它调用了Activity的拓展方法verticalLinearLayout,它的接收者是Activity,内部创建了一个LinearLayout返回。并且用它做接收者调用lambda函数,在lambda函数内部调用的textView方法是ViewGroup的拓展函数,它内部创建了一个TextView加入到LinearLayout的子view。并用这个TextView做接收者调再用lambda函数,所以可以直接设置TextView的setText方法和setBackgroundColor方法。
除了上面kotlin内置的with、apply方法和anko的实现之外, 官方文档 也提供了一个比较典型的例子:
html方法接收一个带HTML类型接收者的lambda函数,它在内部自己创建一个HTML的实例去调用这个lambda函数,于是可以在这个lambda函数里面调用HTML的body方法。
通过上面的几个例子,我们已经了解了带接收者的lambda函数的使用方法,我们可以通过这些典型的用法去设计我们自己的DSL使得我们设计的框架更加易用。

Kotlin进阶系列-函数类型及函数字面值

在 Kotlin 中,函数是一等公民( first class ),这意味着函数可以被存储在变量或者数据结构中,它是有类型的。Kotlin使用函数类型来描述一个函数的具体类型。一个完整语法的函数类型如下:
其特点如下:
接收者类型在参数前,和参数所在的小括号用点连接。关于带接收者的函数类型在之后会详细讲解。
既然函数有类型,那函数类型变量的值是什么呢?这就涉及到函数类型的实例化。函数类型的实例化包括以下几种常用方式。
a. lambda 表达式:
b. 匿名函数:
a. 顶级,本地,成员或者扩展函数。例如: String::toInt 。
b. 顶级,成员,或者扩展属性: List::size 。
c. 构造函数: ::Regex 。
函数类型的值可以通过 invoke 操作符调用,以下是示例。
lambda 表达式的全语法形式如下:
其特点如下:
其返回值是 x-y
Kotlin 有一个约定:如果函数的最后一个参数是函数,那么作为相应参数传入的 lambda 表达式可以放在圆括号之外。示例如下:
以 lambda 表达式作为参数的高阶函数如下:
其调用示例可以简写为:
如果 lambda 表达式是唯一的参数,那其圆括号可以省略,示例如下:
自 Kotlin1.1 起,如果 lambda 表达式的参数未使用,那么可以用下划线取代其名称:
lambda 表达式不能显示的指定返回值的类型。如果需要显示指定返回值的类型,则需要使用匿名函数。匿名函数和普通函数非常类似,除了其函数名被省略。其示例如下:
anonymousTest 中对匿名函数的调用是完整语法形态,由于参数类型和返回值类型可以推断,因此,其可以简写为
请注意,匿名函数参数总是在括号内传递。 允许将函数留在圆括号外的简写语法仅适用于 lambda 表达式。

Kotlin 基础语法

Kotlin 文件以 .kt 为后缀。
kotlin源文件不需要相匹配的目录和包,源文件可以放在任何文件目录。
以上例中 test() 的全名是 com.runoob.main.test、Runoob 的全名是 com.runoob.main.Runoob。
如果没有指定包,默认为 default 包。
有多个包会默认导入到每个 Kotlin 文件中:
函数定义使用关键字 fun,参数格式为:参数 : 类型
表达式作为函数体,返回类型自动推断:
无返回值的函数(类似Java中的void):
函数的变长参数可以用 vararg 关键字进行标识:
lambda表达式使用实例:
可变变量定义:var 关键字
不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量)
常量与变量都可以没有初始化值,但是在引用前必须初始化
Kotlin 支持单行和多行注释,实例如下:
与 Java 不同, Kotlin 中的块注释允许嵌套。
$ 表示一个变量名或者变量值
$varName 表示变量值
${varName.fun()} 表示变量的方法返回值:
当 str 中的字符串内容不是一个整数时, 返回 null:
以下实例演示如何使用一个返回值可为 null 的函数:
或者:
我们可以使用 is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。
或者
甚至还可以
区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成。
区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。以下是使用区间的一些示例:
输出结果:

android kotlin -) 是什么意思

->这个符号是lambda表达式常见符号
符号左边是接受的参数,符号右边是打算进行的函数操作
通俗的例子
-> 表示你的某天的旅游计划
左边参数 可以是时间、地点、钱
右边 是你打算旅游的行程
你的条件准备好了就可以按照行程去旅游
kotlin的lambda表达式可以参考java中lambda的相关
java箭头函数,lambda表达式
kotlin lambda 表达式
kotlin中 -> 这个符号可以理解为“转向”的意思。主要用在三个地方:
1、用于when语句中,
when(a){
1 -> println("1") //a==1时,打印"1"
2 -> println("2")
else -> println("其他") }
2、文字表达式中(包含lambda),
fun main(args: Array

) {

var a=8

var b=5

var c = {x : Int , y : Int -> x + y}

println(c(a,b)) //13

}

3、在函数的参数表中或定义变量时表示数据类型的转向关系

fun test(a : Int , b : (num1 : Int , num2 : Int) -> Int) : Int{

return a + b.invoke(3,5) //8

}

Kotlin中,理解T.()-)Unit 、 ()-)Unit与(T) -) Unit

Kotlin比Java更方便的地方,其中之一是可以将函数作为参数。
上面三者都是将函数作为其它函数的参数来使用,其形式虽然简单,但理解并不简单。
一、共同点
三者的返回值相同,均为Unit,即没有返回值。
当然有返回值也可以,比如返回一个泛型R,或者是一个具体的值Int等
如:

但是这不是重点,要理解三者,主要是分析前面的部分,这里返回Unit只是为了方便理解。
二、定义形式
可以结合Kotlin自带的作用域函数来理解:
apply:

also:

自定义一个使用()->Unit的例子:

三、使用

上面的例子说明了以下几点:
1、T.()->Unit 的函数体中可以直接使用T代表的对象,即用this代表对象
2、(T) -> Unit 将T表示的对象作为实参通过函数参数传递进来,供函数体使用
3、 ()->Unit与T表示的对象没有直接联系,只能通过外部T实例的变量来访问对象

阅读更多 >>>  php基础--变量作用域

四、理解
T.()->Unit 中用this代表对象,而this的使用一般是一个类的成员函数中用来表示该类的实例对象本身,比如,为Person类加一个函数:

所以我们可以这样理解,T.()->Unit相当于是给类T定义了一个扩展函数,该函数没有形参,没有返回值,当然我们也可以增加参数与返回值,道理是一样的。
正是因为T.()为T的扩展函数,所以可以在函数体里直接访问T对象的属性或者成员函数。

(T) -> Unit与 ()->Unit只是一个普通的函数,一个带有参数,类型为T,另一个没有参数而已。
(T) -> Unit在使用it表示实参,是Lambda表达式所规定

五、总结
1、()->Unit与(T) -> Unit是相同的,只是一个带参,一个不带参
(T) -> Unit通过形参T可将对象作为实参传给函数,所以函数体里能通过it或者指定名称的方式来访问该对象

2、T.()->Unit 等同于为T定义了一个无参数的扩展函数,所以在函数体内可以直接通过this或省略来访问T代表的对象

Kotlin laterinit 与 by lazy

laterinit 与by lazy 是Kotlin中两种不同延迟初始化的实现。

laterinit 只用于变量var? ? ?by lazy 只用于常量val

lazy()方法只是接受一个lambda并返回一个Lazy

实例的函数,返回的实例可以作为实现延迟属性的委托:第一次调用get()会执行已传递给lazy()的lambda表达式并记录结果,后续调用get()只是返回记录的结果。

lazy()方法常用于只获取不赋值并且多次使用的对象。

laterinit则用于只能生命周期流程中进行获取或者初始化的变量

laterinit 不能用于可空的属性上和java的基本类型上:(Int、Long等)

laterint 可以在任何位置初始化,并且可以初始化多次。而by lazy只初始化一次

为什么我还不想使用 kotlin 来开发 android

我觉得它之所以适合Android开发,主要是因为以下的特点:
2.1 简洁、优雅
写了很多年的Java之后,再写Kotlin,真是觉得如沐春风。
除了不用写分号以及天然支持Lambda表达式之外,它的语法本身就比Java简洁许多。
举几个小例子,比如,类型推导:
val a : Int = 1 // 正常的声明、赋值
val b = 2 // 类型推导,可以省略Int声明
/* 定义函数:自动推导函数的返回值类型 */
fun sum(a: Int, b: Int) = a + b
字符串模板:
val name = "Barry"
val age = 15
print("My name is ${name}, I am ${age} ") // 会打印出: My name is Barry, I am 15
下面这个例子,可以对比体会一下他们的不同—— 遍历一个列表,打印其中的奇数。
如果用java写:
List list = Arrays.asList("H",1,3,10,5,9,20,199);
for(Object number : list){
if(!(number instanceof Integer)) {
continue;
}
if((Integer)number % 2 == 0){
System.out.println((Integer)number);
}
}
个人觉得android比较好,想学android开发,可以到磨砺营

如何学习Kotlin编程语言

这语言听说bug很多
csdn有很多kotlin的资料
为什么说 Kotlin 是优秀的
本文不会像一般介绍语言的文章那样,一开头就罗列出语言那些酷炫的特性,我们稍后再来探讨这些内容。
首先我将介绍一些其它的信息,因为2013 年一项研究显示,当开发者评估一种编程语言时生态系统要比语言特性更重要。这符合我个人的经验,下面就让我开始介绍吧:
Kotlin 被编译成 JVM 字节码或者 JavaScript 代码。Java 开发者将会是对它最感兴趣的人,不过对于使用垃圾收集运行时语言的开发者而言它也具有一定的吸引力,比如 Scala、Go、Python、Ruby 和 JavaScript 等语言。
Kotlin 来自业界,而不是学术界。它解决了开发者现今面临的实际问题。例如它的类型系统可以帮助你避免空指针异常。
切换到 Kotlin 无需成本!它是开源的但这不是重点,重点是它提供了一个高质量的一键从 Java 转换到 Kotlin 的工具,并且十分关注 Java 二进制文件的兼容性。你可以将现有 Java 项目的一次性转换成 Kotlin 项目,而该项目仍将可以正常编译,即使这是一个包含上百万行代码的复杂程序。
显然你可以从上文得知,Kotlin 程序能够使用所有现存的 Java 框架和库,甚至那些依赖注解处理的高级框架。它们之间的交互是无缝的,不需要包装或者适配层。Kotlin 可以整合 Maven,Gradle 以及其它构建系统。
它十分平易近人,语法精炼直观,仅仅是阅读语言参考文档几个小时就能学会使用。Kotlin 看起来十分像 Scala 但是更加简洁并且兼顾了可读性。
它不遵循特定的编程哲学,例如极度的函数式编程或者面向对象编程风格。
它不会增加运行时的开销。Kotlin 的标准库十分小巧紧凑:专注于扩展 Java 标准库,编译阶段的大量内联操作意味像 map/filter/reduce 等管道结构函数将被编译成类似于命令式语言的代码。
Anko 与 Kovenant 等框架的出现意味着在 Android 开发者中 Kotlin 开始变得流行起来。如果你正在从事 Android 相关的工作,相信你很快就会获得好的工作。你可以阅读这份 Square 公司开发者 JakeWharton 的报告,了解用 Kotlin 进行 Android 开发的体验。
Kotlin 允许你继续使用你的工作效率提升工具。IntelliJ 的 IDE 对 Kotlin 的支持十分完善:你可以对代码进行重构、搜索、导航以及使用自动完成,而且 IDE 充分支持调试、单元测试、性能分析等等功能。
除了 Android,我认为 Kotlin 还非常适用于企业中 Java 的应用场景。如果你的工作是整天埋头于大公司的代码库中,那么当 Kotlin 1.0 版本正式发布时你应该尽快去了解一下:
由知名公司为它提供强大的商业支持。 JetBrains 这家公司 有一个高度称职的大团队致力于该项目,有稳定的商业模式甚至在自己的部分旗舰产品中使用 Kotlin,这表明短期内 Kotlin 不会被放弃。
使用 Kotlin 风险较低:可以由一两个感兴趣的团队成员在项目中小范围的试验 Kotlin,这并不会扰乱你的项目,因为 Kotlin 的类对外提供的 Java API 看起来就与普通的 Java 代码一样。
因为 Kotlin 十分注重语法的可读性,代码审查不会成为问题,对 Kotlin 不熟悉的团队成员仍然能够完成该工作。
Kotlin 基于 Java 6,所以假如你难以在项目中升级使用新版本的 JVM,你可以使用 Kotlin。
今年早些时候我向 Swiss Re 这家瑞士再保险公司的团队(他们使用 Java 和 .NET)展示了 Kotlin。首先我定义了一个简单的 Java 类包含一些字段以及 toString、equals、hashCode 等方法,大概有 50 行代码。然后我将它转换成 Kotlin 代码(大部分是自动完成的),结果仅剩 1 行代码,接着我还演示了其它节省时间的特性。他们看过后对 Kotlin 充满了热情并且认为 Kotlin 是它们项目中 C# 语言的一个潜在竞争对手。
我认为 Kotlin 正中企业 Java 开发者的红心,所以尽管 Kotlin 是免费的,JetBrains 还是能够通过它增加商业版本 IDE 的销售来赚大钱。这将激励他们根据用户的意愿持续改进它。
与此相比,对于那些由不相关产品资助的语言开发者来说,当用户需求与之前的设计理念冲突时,他们很少会因此作出调整。
特性
Kotlin 作为一门新的编程语言能够脱颖而出,是因为它关注生态系统:JetBrains 懂得生产力的高低更多的取决于生态系统而不是便捷的语法。
尽快如此,Kotlin 还是有许多有用的特性能让你编码的过程变得愉快:
我们已经提过 null 安全(可选),它能够让编译器系统的标记潜在的空指针引用。与一些语言不同的是它不涉及 option 类,因此是零开销的,并且还有其它语言特性确保它不会造成不便。
精炼的语法:无处不在的类型推断、简单的函数只需要一行、简单的结构以及 JavaBeans 也只需要一行就能声明、真正的属性——可以在背后自动生成 getFoo/setFoo 方法用于与 Java 进行交互、函数可以独立存在于类之外。
异常均为非检查型。(译者注:感兴趣的可以阅读一下Java 理论与实践: 关于异常的争论)
使用 data class 关键字创建数据类会自动生成通用方法,例如 equals、hashCode、toString 以及 copy 和 componentN(同时声明多个变量时会调用该方法)。这将帮助你在不使用构建器的情况下便捷的获得不变类(immutable classes)。
但如果你需要构造复杂的结构体,借助类型安全的构建器这个特性可以简洁的实现。如果你使用 Google Protocol Buffers 来存储结构化数据, 通过 KBuilders 这个库也能很轻易做到。
支持函数式编程以及零开销的 lambda 表达式,能够在 Java 的集合中做 Map、Filter、Folder 等处理。Kotlin 的类型系统能够自动识别可变或者不可变的集合。
扩展函数特性能够让你在不改动源码的情况下为类添加方法。乍眼一看以为是为了避免写出像 FooUtils 这种风格工具类的语法糖,不过随着使用的加深,你会认识到它不仅能帮你更加容易的通过自动完成使用方法,还能协助你集成现有的 Java API 以及借助其它 Kotlin 特性构建功能强大的扩展。
支持运算符重载,但是不会像 Scala 或者 Perl 那样出现难以理解的代码。运算符被映射成相应名字的方法,通过重写这些方法改变运算符的行为(包括函数调用),但是不能定义新的运算符。这使得程序能够兼顾功能与可读性。
Kotlin 没有宏或者其它的方式来重定义语言,但是通过这些精心设计的特性能够使第三方库自由的对它进行扩展,官方对集合类进行的扩展也只是小试牛刀而已,请看以下例子。
想使用 fibers、actors 和 Go 风格的 channels?一个名为 Quasar 的库已经为你实现了。
使用 Markdown 替代 HTML 来编写 API 文档,这样编写 JavaDocs 可比以前舒适多了。(译者注:JetBrains 提供了相应的文档生成器 Dokka)
更好用的泛型。如果你没有完全掌握泛型参数中 super 以及 extends 的含义,别担心,这不是你的错。Java 的泛型的确令人费解,Kotlin 解决了这个问题。
委托是一个大家都知道的设计模式,Kotlin 原生支持它。
== 运算符的行为符合预期(译者注:简单来说 a == b 相当于 a.equals(b);新增了 === 运算符,用来判断运算符两边是否指向同一个对象)
想快速便捷的进行异步编程吗?当然!
字符串插值“可以使用这样的写法在字符创中直接引用变量 {this.example}”
函数中的参数可以指定默认值、使用可变长度以及通过参数名传参。
还有许多的调整与优化。假如 Java 中有某些让你觉得困扰的问题,我相信 Kotlin 一定已经把它处理好了。
现在就来试用一下!
跟很多现代编程语言一样,Kotlin 可以通过网页浏览器来进行体验。不过跟其他语言不一样的是,Kotlin 的实验网站提供了一个成熟的 IDE,包括响应很快的自动完成,实时的后台编译,甚至还有在线的静态分析!
在线试用一下吧
好了,让我们继续接下来的内容
目前存在哪些问题?
生活中没有什么是完美的,包括 Kotlin。以下是我尝试这门语言时遇到的一些问题。
最大的问题是不够成熟,因为 Kotlin 目前还处于 Beta 阶段,这意味着:
每更新一个版本,语法、ABI 以及标准库就变一次。好消息是这些变化通常比较微小,可以借助 IntelliJ IDE 来自动升级你的代码,所以这个过程并不会太麻烦。
Java-to-Kotlin 的转换工具(J2K)还没有完成。它偶尔会大规模的破坏和默默地擦除 Java 8 中的 Lambdas(修改:2015 年 10 月:M13 版本的转换工具已经可以正确地处理 Java 8 的特性了)。由它转换而成的代码并不总是最好的写法,但是 JetBrains 为这个工具付出了大量努力,它已经是我用过的语言转换工具中最好的了。所以我并不太担心这个问题,这个转换器正在迅速的改进中,变得越来越成熟。
你会遇到编译器错误。尽管我的程序并不大,但还是会发生无法编译的情况,甚至错误的编译结果。诊断这些问题并不难,但终归还是影响了开发的体验。
你会遇到 IDE 内部错误。当这个错误发生时,IntelliJ IDE 会弹出一个悬浮窗口,附带向 JetBrains 报告的选项。大部分错误无需理会,不过依然会使人厌烦。
偶尔会出现无法加载提示文档的错误(修改:M14 版本发布后,这个问题已被修复)
目前 JetBrains 正致力于完善发布 1.0 版本而不是添加新的功能,期待这些问题能够得到修复。
第二个我遇到的比较大的问题是,有时与 Java 的交互会受到局限。
一个典型的 Bug 是 Java 的类型系统无法防止你改变 Map 中 Key 的类型。按理来说,这样操作应该导致编译器报错,例如使用类型错误的 Key 删除元素。有些 JDK 中的集合使用了泛型,它们某些重要方法的泛型参数是 Obejct,所以编译器不会提示。当在 IntelliJ IDE 中编写 Java 代码时会有静态分析的警告,但是目前 Kotlin 环境还没有这个功能。因为 Kotlin 使用的是 Java 的集合框架没有自己实现,所以这导致了一些类型安全方面的问题,我已经遇到好几次了。
(修改:1.0 Beta 版本中这个问题已经解决了,Java 中集合框架的类型安全缺陷在 Kotlin 已经不复存在。哟呵!)
另一个例子是,当调用或使用 Java 代码时 Kotlin 的 Null 安全特性无法发挥作用(可以借助注解弥补)。作为 Kotlin 的初学者,刚开始你可能会写许多调用 Java 库的代码,但是因为以上的问题它们并没有你想象中那么好用。这种情况的改善只能等待 Kotlin 使用人数的增长。JetBrains 一直在尝试使 Null 安全特性能体现在 Java 交互中,这种想法是好的,但有时考虑并太周全。(修改: 从 M13 版本开始,在 Java 代码中将自动以 @NotNull @Nullable 等注解实现 Kotlin 的 Null 安全特性)
虽然有以上的问题存在,但同时也使得我们能更流畅的使用 Java API,我觉得这种权衡是值得的,只是在开发中要注意。
其它需要考虑的问题:
Kotlin 的社区还比较小。虽然目前没有多少 Kotlin 的库可以使用,但是凭借优秀的 Java 交互能力,Kotlin 可以使用现有成熟的 Java 库。
如果你喜欢看书来学习,那么你需要等到今年晚些时候才能看到 Kotlin 开发者写的书(译者注:Kotlin in Action)
纯粹的函数编程风格开发者可能会觉得类型系统中缺乏一些 Scala 或 Haskell 拥有的高级功能。如果你对类型系统一些功能比较看重,那么 Kotlin 可能不适合你。
Kotlin 还能编译成 Javascript 代码,但是比较少用,所以可能会遇到更多的问题,这是我从论坛中得到的印象。(修改: 目前 Kotlin 的开发重心在于完成 1.0 版本并使其稳定运行在 JVM 中,Javascript 方面的问题将会在 1.0 发布后着手解决)
没有标准的编程风格指南,目前 Kotlin 提供了多种语法可供选择。不同人写出来的 Kotlin 代码很可能完全不一样。这与 Go 严格的风格形成了鲜明的对比。(修改: Kotlin 1.0 版本开始,一些灵活的语法已经被移除了,例如现在重载运算符以及定义中缀函数时必须分别使用 operator 和 infix 关键字进行标记)
Kotlin 的编译速度稍稍慢于 Java,以及 IntelliJ IDE 的智能提示反应有点缓慢,不算严重而且比 Scala 快多了。(修改:Kotlin 1.0 开始编译速度有了明显提升)
Kotlin 有一个 Eclipse 插件,但是很明显没有 IntelliJ 的好用。
Kotlin 在某些方面比 Java 要严格。它不会自动将 Int 转换为 Long 类型,需要开发者显示的转换。这是因为 Kotlin 关注正确性和试图解决《Java Puzzlers》一书中提出的问题。JetBrains 声称他们已经搞定一半了。
Kotlin 基于 Java 6,因此会受到它的局限。Kotlin 与 C# 在很多领域都很相似甚至比 C# 做得更好,但是它缺少一些功能,例如 Java 平台尚未支持的某些数据类型。
为什么应该开始考虑使用 JVM
最近一段时间我遇到了很多使用动态脚本语言(JavaScript 或者 Go —— 译者注:Go 应该是静态编译型语言)的创业公司。
我在 Bitcoin Space 工作的时候,使用动态语言是非常痛苦的事情。在这些语言里没有安全性的类型,这已经导致了巨大的货币损失。Go 比较少出错,但是在基础层面上给人的体验依然很差,比如说缺少好的调试工具,快速 GC 机制,稳健的管理器以及可靠的分析工具。
过去 15 年或者更长时间里,Java 变得越来越健壮,越来越冗长,甚至有过度设计的迹象,这些变化很大程度上源于它的声誉。企业级 Java 类的名字 PathVariableMapMethodArgumentResolver 就是例证。在很长一段时间里我没有考虑 JVM,我确信这种环境并不适合我。
最终我因为 Android 被迫回到 Java,发现 Java 的开发环境已经改变了。虽然 XML 仍然不合时宜的频繁出现在各种场合,但是一些基础功能十分完善,令人印象深刻。 IntelliJ 是比 Eclipse 更快并且更智能的 IDE。Maven 一出现就得到了迅速的发展,拥有许多原本我想要其它构建 / 依赖系统增加的功能。较新的 Web 框架像 Ninja 和 Play 从类似 Ruby on Rails 的框架中学到了轻量简洁。有大量的库可供使用。硬件性能变得更高以及 JVM 变得更有效率,等等转变。
没有真正改变的是语言本身,Java 代码写起来依然是令人不快的冗长。
现在有了 Kotlin,完全无需承受离开 Java 现有的生态系统的疼苦。你可以编写更富有表现力的代码,但是却比脚本语言更简洁,同时拥有更好的性能和更少的错误。
如果你喜欢 JavaScript,可以尝试 Kotlin 的 JS 后端,或者在 Nashorn JS 引擎里运行你现有的代码。
最后,如果你喜欢 Go 语言是因为它可以编译独立运行的程序,那么试试 javapackager 工具。Kotlin 在本地为每个平台创建了捆绑包,这意味着在 linux 上不需要 JRE 的依赖就可以独立自主的获取 DEBs(linux 的安装包)或者压缩包。当然,它拆包之后不是单个文件而是单个目录,从部署的角度来看并不难操作。
简而言之:如果你之前因为看 Java 不顺眼而忽略了 JVM 的生态系统,那么你应该借着 Kotlin 这门新语言进入这个世界瞧瞧。

阅读更多 >>>  malloc函数用法,malloc函数的参数是什么

现代编程语言那些让人激动的特性

有没有觉得,发展到现在,软件开发行业是越来越成熟了,无论是过程管理、架构方法、设计方法,还是语言、平台、框架、工具等,都发展到了一个前所未有的高度,相关思想和理念也日臻完善,我们真正进入了一个最好的时代。

单就编程语言来说,近些年包括Scala(2003)、Groovy(2003)、Go(2009)、Kotlin(2011)、Swift(2014)等新兴编程语言如雨后春笋版涌现出来,也给我们带来了很多让人眼前一亮的编程特性,甚至Java这等老牌编程语言也是不断推陈出新,编程再也不像过去那般枯燥。

本篇就带大家一起感受一下现代编程语言那些激动人心的特性。

这个特性其实有点早了,但是也是很早就让人感动的语言特性了,熟悉Javascript的同学应该对它很了解。Javascript语言具有动态性,我们可以随时为类的某个实例添加方法,也可以利用动态原型,为类的所有实例添加方法,有没有感觉扩展类的实现变得非常方便了呢?

扩展和原型很像,允许我们在不修改或继承类的情况下,将新的函数方法添加到原类中。这个特性较早见于C#这门语言,目前在Kotlin、Swift中均可以看到。这里顺便说一下C#,当时C#出来的时候,不得不说很多特性是非常棒的,包括扩展方法、泛型、分部类等等,比Java好不要太多。像Kotlin,不仅可以扩展类的方法,还可以扩展类的属性。

前两个都是关于扩展代码的,这里再来一个。我们知道Java 1.8以来,接口interface里的方法可以有自己的默认实现了,大大方便了实现类,减少了重复代码。相对于Java的这个实现是显示的,Go语言的接口实现可以是隐式的,添加隐式实现后,所有继承的结构(Go没有类,都是结构struct)都可以调用这个方法,和前面的两个特性有异曲同工之妙,下面我们对比看一下。

C语言就有宏的概念,通过 #define 定义,然后在代码中进行替换。宏作为Rust语言的高级特性,可以操作语法单元,是一种通过编写代码来生成代码的方式,被称作“元编程”(meta programming)。相对于函数,宏可以接受任意多个参数,可以减少重复代码,定义DSL。宏语法比较复杂,难以编写和调试,以至于在Rust文档中说,宏将是其最后的特性。

当你回想写代码枯燥的时候,应该会想到为字段编写getter、setter吧?较早的时候,C#就意识到了这个问题,贴心地推出了自动属性这个语法糖。而Java开发者则是通过Eclipse、IDEA这样的开发工具来自动生成getter、setter代码。当然,现在也可以依赖Lombook包,使用lombok的注解@Getter @Setter来编译时生成相关代码。

据说空指针异常是软件业最贵的异常,价值10亿美元。你有没有为处理调用链中的null值而烦恼过?又或者被伤害过?Kotlin会在编译期提示对可能为null变量的不安全使用,也提供了Elvis 操作符 ?: 来方便地处理null值。而有了可选链,就舒服多了。可选链语法应该较早出现在JavaScript语言中,新兴语言Swift也提供了这一省心的特性。Swift英明地决定变量是不允许直接存储NIL值,当然也提供了optionals的装箱功能允许将NIL或其它值包装起来,方便有时使用。

输入乃万恶之源,函数首要的事情就是检查不规范和不安全的输入,这也是卫语句的来历。Swift语言为此提供了专门的卫语句语法,有了它的贴身防护,整个代码都干爽多了,剧烈运动都不怕,不信往下瞧:

如果要评选最酷的语言特性,那么Lambda表达式必须获得提名。Lambda表达式很早就出现在Lisp语言中,python也有,在后来的C#语言大放异彩,又一次狠狠地羞辱了不长进的Java,而Java也终于在1.8版本后加入了这一特性,甚至C++ 11也光荣地上车了。

我们知道编程语言有静态和动态之分,静态语言如Java 、 C# 、 C 和 C++,动态语言如Perl,Python,JavaScript,Ruby 和 PHP等,多数为脚本语言。而融合了静态和动态特性的语音,就被称为渐进式语言,如TypeScript、Common LISP、Dylan、Cecil、Visual Basic.NET、Bigloo Scheme、Strongtalk等。静态类型检查可以尽早地发现 BUG,动态类型检查可以方便地处理依赖于运行时信息的值的类型。 渐进式语言允许类型注释来控制程序的一部分使用静态类型检查,而另一部分为动态检查,更具灵活性。 Python从3.5开始引入了对静态类型检查的支持。

在面向对象的编程语言中,状态是计算的基础。由于可变状态的存在,在编写高并发,多线程代码时,无法知道并行进行的诸多状态读写中是否有顺序上的错误,而且这种错误又是难以察觉的,而不变性则规避了这个问题。 不变性是函数式编程的基础,不变性意味着函数没有副作用,无论多少次执行,相同的输入就意味着相同的输出,所有线程都可以无所顾忌的执行同一个函数的代码,代码更像数学函数,更易理解和测试。

String就是构建在Java语言内核中的不可变类的一个典型例子。Java 的 CopyOnWrite系列容器类也是利用了不变性增强了并发安全性。Java可以通过final修饰符实现类和变量的不可变。而Scala、Swift、Groovy等语言也有各自的语法实现不可变的变量和类。

多重分派是一些编程语言的特性,其中的函数或者方法,可以在运行时间(动态的)使用一个或多个实际参数的组合特征,路由动态分派至实现函数或方法。多重分派主要区别于我们常见的重载方法,重载方法是在编译期就绑定了,而多重分派是在运行期分派的。Lisp、Julia、C#、Groovy等语言内建多分派特性,JavaScript、Python和C等语言通过扩展支持多分派。 多重分派可以避免我们写很多分支条件,而是更直观地用对象类型表达,使代码变得可读性更好并且较少发生错误。

前面几个特性是不是略显沉闷,那么来看一下这个激动一下。解构这一语法特性用于从数组索引或对象属性创建变量,简直帅到飞起。

爱写单元测试的同学有福了,这个绝壁是重磅炸弹,在生产代码里夹着测试代码,你有想过这么写测试吗?谁想的?简直脑洞打开啊!该特性在Pyret语言中,Pyret旨在作为编程教育的杰出选择,同时 探索 脚本和函数式编程的融合。

如果内联测试没有让你震惊,D语言内联编译期的这个特性绝对会让你惊掉下巴,基于该特性,开发人员可以直接在D语言中嵌入汇编代码,彻底放飞自我了,俺滴亲娘啊!受不了!受不了!顺便说一下,D语言比较小众,是C++的一个改进型,它包括了按合约设计、垃圾回收、关联数组、数组切片和惰性求值等特性。

好吧,我们看点其它的来压压惊吧。尽管Kotlin语言也说自己实现了模式匹配,但是实际上只是一点点帅,真正帅的是 Elixir语言的模式匹配,Elixir作为一种在Erlang OTP上运行的动态类型语言,将模式匹配提升到了一个全新的水平。

在编程语法上,Python真是个神一样的存在,for循环都能写出花来。

Java 8 中提供了Stream API特性, Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式,来提供一种对 Java 集合运算和表达的高阶抽象。事实上这个特性C#早就有了(Java又躺枪一次)。不得不说,利用这个特性写出来的代码,看上去还真的是很流利的。

网站数据信息

"kotlin lambda表达式,现代编程语言那些让人激动的特性"浏览人数已经达到20次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:kotlin lambda表达式,现代编程语言那些让人激动的特性的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!