这就是面向对象范式混合函数式编程的自由乐趣吧! 本章将介绍Kotlin标准库中的集合类,我们将了解到它是如何扩展的Java集合库,使得写代码更加简单容易。...Set 集 Set 集是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放一堆溜溜弹珠。 Set 集中没有重复对象。...Map 映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了 对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字是唯一的。...7.1.2 Kotlin 集合类继承层次 下面是 Kotlin 中的集合接口的类图 ? Kotlin 集合类继承层次 其中各个接口说明如下表所示 接口 功能 Iterable 父类。..., b2, b3, b4], [c1, c2, c3, c4]] Kotlin中还提供了一个 flatten() 函数,效果是把嵌套的List结构“压平”,变成一层的结构,代码示例如下 strlist.map
第4章 类与面向对象编程 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统等相关的知识。在本章节以及下一章中,我们将一起来学习Kotlin对面向对象编程以及函数式编程的支持。...因此,每一个对象包含两部分:成员变量和成员方法。在成员方法中可以改变成员变量的值。 2.程序是对象的集合,他们通过发送消息来告知彼此所要做的事情,也就是调用相应的成员函数。...当向某个对象发送消息(请求)时,这个对象便知道该消息的目的(该方法的实现已定义),然后执行相应的代码。 我们经常说一些代码片段是优雅的或美观的,实际上意味着它们更容易被人类有限的思维所处理。...在面向对象编程中,一个理想的对象应该是只暴露它的抽象接口(纯表面, 无体积),其方法则扮演箭头的角色。...在Java 8 和Kotlin中,接口可以实现一些通用的方法。 接口是抽象类的延伸,Kotlin跟Java一样,不支持同时继承多个父类,也就是说继承只能存在一个父类(单继承)。
} 上面的代码简单说明如下: 1.Kotlin中的包package的使用跟Java基本相同。...数据类以极简的方式创建POJO。 运算符重载相当简单。 快速方便地扩展内置类、自定义类的函数与属性。...很显然的一个事实就是,跟用机器语言写的低层次结构代码相比,用编译语言写成的高层次结构代码更接近于人一般思考时所用的概念。...和汇编语言不同的是,在C语言的语句和机器语言的指令之间不再是简单的一一对应的关系,不过毫无疑问的是,仍然有一种从C语言代码到机器语言代码的映射关系,但是这种关系要比从汇编到机器语言之间的关系要复杂多了。...Kotlin正是这么做的。 3.静态变量(Static)。静态方法经常会导致需要显式的定义接口,从而使得API更加复杂。
多平台项目 (实验性) 多平台项目是 Kotlin 1.2 中的一个新的实验性功能,允许你在 Kotlin – JVM, JavaScript 和(将来的)Native 上所支持的目标平台之间重用代码。...弃用:枚举项中的嵌套类型 在枚举项中,由于初始化逻辑中的问题,定义一个不是内部类的嵌套类型的功能已经被弃用。在 Kotlin 1.2 中这将会引起警告,并将在 Kotlin 1.3 中报错。...弃用:改变只读属性的 backing 字段 在自定义 getter 中通过赋值 field = ......kotlin.text.Regex 类已成为可序列化的类,现在可以在可序列化的层次结构中使用。...在 Kotlin 1.2 中,这将会报错,因此需要使用 JVM 1.8 来编译这些代码。 破坏性变更:平台类型的 x.equals(null) 一致行为 在映射到 Java 原语 (Int!
转自:开源中国 www.oschina.net/translate/whats-new-in-kotlin-12 多平台项目 (实验性) 多平台项目是 Kotlin 1.2 中的一个新的实验性功能,允许你在...这也使得可调用的引用在你引用外部接收者的成员的 lambda 中更方便使用。...弃用:枚举项中的嵌套类型 在枚举项中,由于初始化逻辑中的问题,定义一个不是内部类的嵌套类型的功能已经被弃用。在 Kotlin 1.2 中这将会引起警告,并将在 Kotlin 1.3 中报错。...kotlin.text.Regex 类已成为可序列化的类,现在可以在可序列化的层次结构中使用。...在 Kotlin 1.2 中,这将会报错,因此需要使用 JVM 1.8 来编译这些代码。 破坏性变更:平台类型的 x.equals(null) 一致行为 在映射到 Java 原语 (Int!
在程序开发中,if else是我们经常用到的条件判断语句。在程序逻辑中,免不了会有各种条件的判断,并根据结果执行对应的逻辑。if else的好处就是简单,可读性高。...解决方法将很长的判断式封装成函数或者定义成宏,并以一个清晰表达意图的名字命名,名字能够体现出业务意义。...这个例子只是嵌套了两层,就已经不容易读了。真实项目中这个问题严重的多,个人这是对代码 可读性差的重要元凶。解决方法提前return。把一些场景提前return掉。...显式路由转发现象if else中,还有种场景,if else中只有单层,没有嵌套,功能上只是做路由转发作用,这种情况使用if else的方式逻辑上也是很简单。...解决方法如果想要代码看起来更美观,可以做成隐式映射,隐式映射有两种方法:枚举和Map方式。
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。而我们在OOP中的那么多的设计模式,其实就是在OOP的多态性的约束规则下,对这些函数指针的调用模式的总结。...在函数编程中,我们有一个内置的框架来开发更小的、更简单的和更一般化的模块, 然后将它们组合在一起。 函数编程的一些基本特点包括: 函数是"第一等公民"。...所以在我们的讲求工程实践性能的Kotlin语言中, 古老而美丽的理论,也许能够给我带来思想的启迪,但是在工程实践中未必那么理想。 闭包(Closure) 闭包简单讲就是一个代码块,用{ }包起来。...因为Scheme 程序中充满了一对对嵌套的小括号,这些嵌套的符号体现了最基本的数学思想——递归。...Lambda类型, 然后通过E call(Object input)方法实现自调用,方法实现里有多处转型以及嵌套调用。
到这里,自定义 Gradle 插件最基本的步骤就完成了,接下来就可以在 Plugin#apply 方法中开始你的表演。 ---- 3....release 和 debug,我们可以在 buildType 中定义任意多个且任意名称的类型,这个是如果实现的呢?...1、定义类型 T: 在类型 T 中必须带有以 String name 为参数的 public 构造函数。...插件调试 4.1 两个调试方法 在开发插件的过程一定需要调试,除了通过日志调试,我们也有断点调试的需求。这里总结两个方法:方法 1 虽然只支持调试简单执行任务,但已经能满足大部分需求,而且相对简单。...而方法 2 支持命令行添加参数。 方法 1(简单): 直接提供 Android Studio 中 Gradle 面板的调试功能,即可调试插件。
当向某个对象发送消息(请求)时,这个对象便知道该消息的目的(该方法的实现已定义),然后执行相应的代码。 我们经常说一些代码片段是优雅的或美观的,实际上意味着它们更容易被人类有限的思维所处理。...Kotlin中的类和接口跟Java中对应的概念有些不同,比如接口可以包含属性声明;Kotlin的类声明,默认是final和public的。 另外,嵌套类并不是默认在内部的。...Kotlin类的成员可以包含: 构造函数和初始化块 属性 函数 嵌套类和内部类 对象声明 等。...我们可能直接简单地写成: class World1 { val yin: Int val yang: Int } 在Kotlin中,直接这样写语法上是会报错的: ?...,那么我们在子类中把它依然定义为抽象函数。
比如说,如果你在调用一个返回“T”的泛型方法时,并将它的返回值“T”转换为特定类型如“Foo”,编译器就会推断出这个方法调用中的“T”其实是“Foo”类型。...这也使得可调用的引用在你引用外部接收者的成员的lambda中更方便。 弃用 Kotlin1.2版本也弃用了很多不合理的东西。...弃用:枚举条目中的嵌套类型 在枚举条目中,inner class由于初始化逻辑中的问题,定义一个非嵌套的类型已经被弃用了。这会在Kotlin 1.2中引起警告,并将在Kotlin 1.3中出错。...弃用:只读属性的后台字段 field = …已经废弃了在自定义获取器中分配只读属性的后台字段,Kotlin 1.2中有警告,Kotlin 1.3中有错误。...Java默认方法调用 在Kotlin 1.2之前,接口成员在针对JVM 1.6的情况下重写Java默认方法会在超级调用上产生一个警告:Super calls to Java default methods
EJ 第1条:考虑使用静态工厂方法代替构造器 在实例化对象的方式中,使用静态工厂方法相比构造器有几个好处: 工厂方法拥有名字,易于开发者理解。...Kotlin 在访问权限的设计更彻底的贯彻了使可访问性最小化的准则。...原因很简单:如果直接暴露成员属性,将来想改变其内部实现是不可能的,反之,如果是暴露方法,则可以在方法中轻易地修改实现。...其实很简单,将类定义为 final 类,退而求其次,如果类允许继承,则定义不允许重写的方法为 final 方法。 既然这是个更好的实践,为什么将其作为默认设计?...Kotlin 在语法层面直接对该条款进行支持,静态成员类在 Kotlin 中称为『嵌套类』,默认的内部类便是嵌套类,比如: class Outer { class Inner { // 默认便是静态成员类
嵌套类 一个类可以在单独的代码文件中定义,也可以在另一个类内部定义,后一种情况叫做嵌套类,意即A类嵌套在B类之中。乍看过去,这个嵌套类的定义似乎与Java的嵌套类是一样的,但其实有所差别。...下面是Kotlin定义嵌套类的代码例子: class Tree(var treeName:String) { //在类内部再定义一个类,这个新类称作嵌套类 class Flower (...数据类说神秘也不神秘,它的类定义代码极其简单,只要开发者在class前面增加关键字“data”,并声明入参完整的构造函数,即可无缝实现以下功能: 1、自动声明与构造入参同名的属性字段; 2、自动实现每个属性字段的...那么如果某个泛型函数在类内部定义,即变成了这个类的成员方法,又该如何定义它呢?...() } 总结一下,本文介绍了Kotlin的六种特殊函数,首先嵌套类和内部类都定义在某个外部类的内部,区别在于能否访问外部类的成员;其次枚举类和密封类都提供了有序的枚举值集合,区别在于密封类的定义更加严格
Redux 架构基于一个严格的单向数据流,应用中的所有数据都是通过组件在一个方向上流动。Redux 希望确保应用的视图是根据确定的状态来呈现的。...Actions:简单说 Actions 就是事件,包含要传递给 store 的信息,表明我们希望怎样改变应用的状态。...这样你就通常需要在一个状态的变更响应中去进行另一个 store 的 action 分发,而这很容易造成无限循环。 另一个原因是多 store 的架构是非常僵化的,难以灵活的改动。...保持应用的状态层级尽可能少 因为 Redux 中 state 是不可变的,因此深层次嵌套的 state 会产生很多的样板代码,并且难以更新。...Kotlin 中类似 data class,when 语句之类的特性,能让你的代码清晰很多。例如,在 Reducer 中匹配 action 时,可以选择用 instanceof 方法实现。
空安全是Kotlin提供的功能之一。它让你思考语言级别的可空性,所以你可以避免在Java中很常见的NullPointerException。...① 使用val而不是var Kotlin让你在语言层面思考不可变性。val是只读的,var是可变的。建议你尽可能多的使用只读属性。它们是线程安全的,并且在函数式编程中很好用。...这在Android中很常见。对于这种情况,我们使用Kotlin提供的lateinit。 !!的写法 private var mAdapter: RecyclerAdapter?...let{uploadPhoto(it)} } ④ 创建全局函数来处理更复杂的内容 let是一个简单的空检查的替代品,但是会有更复杂的情况。如: if(name!=null&&address!...} 你可以嵌套两个let,但是可读性会很差。
现在你可以在同一个文件中的任何地方定义一个密封类的子类,而不只是以作为密封类嵌套类的方式。 数据类现在可以扩展其他类。...在 Kotlin 1.1 中,你可以限制这种情况,以使只有在 td 的隐式接收者上定义的方法 会在传给 td 的 lambda 表达式中可用。...,但是没有一种简单的方法来做相反的操作:从映射中删除一个键采用不那么直接的方式如 Map.filter() 或 Map.filterKeys()。...目前这并不改变字节码的语义(特别是,接口和 lambda 表达式中的默认方法 的生成与 Kotlin 1.0 中完全一样),但我们计划在以后进一步使用它。...这些构件是在 kotlin-stdlib 之上的微小扩展,它们将它作为传递依赖项带到项目中。 字节码中的参数名 Kotlin 现在支持在字节码中存储参数名。
Spring Webflux最近 介绍一个特性来定义函数式API,它使用一个非常直观的基于 Kotlin的 DSL。...这篇文章将简单地展示一组具有鲜明对比的定义API的方式,一个是基于java流畅的API,一个是基于Kotlin的DSL。...在Java中,使用函数式编程风格来定义一组CRUD的Spring Webflux API,代码通常是这样的: RouterFunction<?...如果这个API更加复杂,譬如Sébastien Deleuze所演示的精彩例子中所示,有多个层次的嵌套,这时基于kotlin DSL的优势就发明显了。...在下一篇文章中,我将深入研究这种支持是如何实现的。 这个示例在 my GitHub repo here可以找到。
有任何问题,欢迎随时与我交流~ ---- 8.2 在Kotlin中使用函数式编程 好了亲,前文中我们在函数式编程的世界里遨游了一番,现在我们把思绪收回来,放到在Kotlin中的函数式编程中来。...为了让事情简单化(在Java 8中,增加Lambda表达式的支持),我们在Kotlin中使用普通的函数来替代函数式接口。事实上,函数式编程中的函数,比C语言中的函数或者Java中的方法都要强大的多。...list.filter((fun(x: Int): Boolean { return x % 2 == 1 })) 8.2.11 Lambda 表达式 我们也可以直接使用更简单的...使用Lambda表达式定义一个函数字面值: >>> val sum = { x: Int, y: Int -> x + y } >>> sum(1,1) 2 我们在使用嵌套的Lambda表达式来定义一个柯里化的...我们将在下一章 中介绍Kotlin的 轻量级线程:协程(Coroutines)的相关知识,我们将看到在Kotlin中,程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。
相对于传统的API, DSL 更加富有表现力、更符合人类语言习惯。 本章就让我们一起来学习一下 Kotlin中 DSL的相关内容。...DSL 简单讲就是对一个特定问题 (受限的表达能力) 的方案模型的更高层次的抽象表达(领域语言),使其更加简单易懂 (容易理解的语义以及清晰的语义模型)。...中,可以将foo.invoke()简写成foo(),在 kotlin 中操作符是可以重载的,()操作符对应的就是类的重载操作符函数 invoke。...而实际上在Kotlin 中,在类的对象实例上我们也可以像函数那样直接使用 () 操作符来调用这个类的一个 invoke 操作符函数。用代码示例来说明可能会更加简单直接。...") Hello, Kotlin 这段代码在 Hello 类中定义了一个操作符函数invoke,然后我们声明了一个 Hello 类的实例对象 hello, 接下来神奇的事情发生了 hello("World
逐渐地,产生了面向过程的编程方法; 后来, 人们发现将数据和逻辑封装成对象, 更接近于现实世界, 且更容易维护大型软件, 又出现了面向对象的编程语言和编程方法学, 增加了新的语言特性: 继承、 多态、...也就是说,在 Kotlin 中默认每个类都是不可被继承的。这么做的目的是为了程序运行的性能。...在 Kotlin 中,有private、protected、internal以及 public等四种修饰符,它们可用于修饰类、对象、接口、构造器、函数、属性、以及属性的set方法等。...Kotlin中的继承抽象类,实现接口的处理方式,跟Java一样,采用“单继承,多实现”的方式。...如果父类的这个函数 open fun v() {} 没有标注open,则子类中不允许定义同名函数,不论加不加override。 成员标记为override的本身是开放的,也就是说,它可以在子类中重写。
Kotlin 对象创建 Kotlin 类支持实例化,默认情况下所有类都是不可变的,并且需要显式属性声明来定义可变属性。...Kotlin 数据类的属性填充 在 Kotlin 中,默认情况下所有类都是不可变的,并且需要明确的属性声明来定义可变属性。...它允许创建新实例,因为 Kotlin 生成copy(…)创建新对象实例的方法,该方法从现有对象复制所有属性值并将作为参数提供的属性值应用到该方法。...该类com.bigbank.SavingsAccount映射到savingsAccount集合名称。 所有嵌套对象都作为嵌套对象存储在文档中,而不是作为 DBRef 存储。...这是一个更复杂的映射示例。
领取专属 10元无门槛券
手把手带您无忧上云