您好,欢迎来到聚文网。 登录 免费注册
KOTLIN核心编程(水滴技术团队出品.深入阐述KOTLIN设计哲学.语言特性.设计模式.函数式编程和工程实战等核心内容)

KOTLIN核心编程(水滴技术团队出品.深入阐述KOTLIN设计哲学.语言特性.设计模式.函数式编程和工程实战等核心内容)

  • 字数: null千字
  • 装帧: 平装
  • 出版社: 机械工业出版社
  • 作者: 水滴技术团队
  • 出版日期: 2019-04-01
  • 商品条码: 9787111624318
  • 版次: 1
  • 开本: 16开
  • 页数: 360
  • 出版年份: 2019
定价:¥89 销售价:登录后查看价格  ¥{{selectedSku?.salePrice}} 
库存: {{selectedSku?.stock}} 库存充足
{{item.title}}:
{{its.name}}
精选
编辑推荐
(1)本书作者团队强大:水滴技术团队出品,团队核心成员均来自阿里、淘宝,其中不乏章建良(网名:Jilen)等技术大牛。(2)书中干货多,且具备一定深度:本书不是一般泛泛讲语法的书,而是一般围绕Kotlin设计理念对所有核心内容进行详细剖析的书,有一点Java基础,想高层次入门Kotlin的读者,本所不容错过。
内容简介
本书不是一本简单介绍Kotlin语法应用的图书,而是一部专注于帮助读者深入理解Kotlin的设计理念,指导读者实现Kotlin高层次开发的实战型著作。书中深入介绍了Kotlin的核心语言特性、设计模式、函数式编程、异步开发等内容,并以Android和Web两个平台为背景,演示了Kotlin的实战应用。全书共13章,分为4个部分:热身篇—Kotlin基础(第1~2章),简单介绍了Kotlin设计哲学、生态及基础语法,其中包括Kotlin与Scala、Java之间的关联与对比,以及Kotlin的类型声明的特殊性、val和var的使用、高阶函数的使用、面向表达式编程的使用、字符串的定义与操作等内容;下水篇—Kotlin核心(第3~8章),深入介绍了面向对象、代数数据类型、模式匹配、类型系统、Lambda、集合、多态、扩展、元编程等Kotlin开发核心知识,这是本书的重点,其中涉及很多开发者特别关心的问题,比如多继承问题、模式匹配问题、用代数数据类型抽象业务问题、泛型问题、反射问题等。潜入篇—Kotlin探索(第9~11章),探索Kotlin在设计模式、函数式编程、异步和并发等编程领域的应用,其中包括对4大类设计模式、Typeclass实现、函数式通用结构设计、类型替代异常处理、共享资源控制、CQRS架构等重点内容的深入剖析;遨游篇—Kotlin实战(第12~13章),着重演示了Kotlin在Android和Web平台的实战案例,其中涉及架构方式、单向数据流模型、解耦视图导航、响应式编程、Spring 5响应式框架和编程等内容。
作者简介
水滴技术团队核心成员来自阿里巴巴、淘宝,公司旗下的大数据SaaS类产品服务了Booking、阿里集团、小米集团、大疆创新、拍拍贷等几十万家企业,是微信的重点第三方合作产品。推崇函数式编程,喜欢尝试各种新的前后端技术。团队在2015年就实现了业界领先的全异步开发架构,该架构是基于fp Scala及微服务化的分布式系统。同时,水滴技术团队还是国内外少有的pure fp技术团队,采用了如Play! Framework、Akka、Cats等新潮的技术,并对JVM生态的一些编程语言有着较丰富的实战经验,当前主要为Scala、Kotlin社区输出博客和开源项目。章建良(网名:Jilen)水滴技术团队核心成员,杭州极跑科技联合创始人,曾就职于淘宝。从2008年开始,活跃于Scala社区,在函数式编程和并发领域拥有极丰富的实战经验。此外,他还是知名开源项目Quill的核心贡献者,目前正在创造一个纯函数式的异步数据库驱动asyncdb。
目录
前言热身篇  Kotlin基础第1章  认识Kotlin21.1  Java的发展21.1.1  Java 8的探索31.1.2  Java未来的样子31.2  Scala的百宝箱31.2.1  学术和工业的平衡41.2.2  复合但不复杂41.2.3  简单却不容易51.3  Kotlin—改良的Java51.3.1  Kotlin的实用主义61.3.2  更好的Java61.3.3  强大的生态81.4  本章小结8第2章  基础语法102.1  不一样的类型声明102.1.1  增强的类型推导112.1.2  声明函数返回值类型112.2  val和var的使用规则132.2.1  val的含义:引用不可变132.2.2  优先使用val来避免副作用142.2.3  var的适用场景152.3  高阶函数和Lambda162.3.1  抽象和高阶函数172.3.2  实例:函数作为参数的需求172.3.3  函数的类型192.3.4  方法和成员引用212.3.5  匿名函数222.3.6  Lambda是语法糖222.3.7  函数、Lambda和闭包252.3.8  “柯里化”风格、扩展函数262.4  面向表达式编程292.4.1  表达式比语句更安全302.4.2  Unit类型:让函数调用皆为表达式322.4.3  复合表达式:更好的表达力332.4.4  枚举类和when表达式342.4.5  for循环和范围表达式372.4.6  中缀表达式392.5  字符串的定义和操作412.5.1  定义原生字符串412.5.2  字符串模板422.5.3  字符串判等432.6  本章小结43下水篇  Kotlin核心第3章  面向对象463.1  类和构造方法463.1.1  Kotlin中的类及接口463.1.2  更简洁地构造类的对象493.1.3  主从构造方法553.2  不同的访问控制原则563.2.1  修饰符573.2.2  可见性修饰符613.3  解决多继承问题643.3.1  骡子的多继承困惑643.3.2  接口实现多继承653.3.3  内部类解决多继承问题的方案673.3.4  使用委托代替多继承693.4  真正的数据类713.4.1  烦琐的JavaBean 713.4.2  用data class创建数据类 733.4.3  copy、componentN与解构753.4.4  数据类的约定与使用783.5  从static到object793.5.1  什么是伴生对象793.5.2  天生的单例:object813.5.3  object表达式823.6  本章小结84第4章  代数数据类型和模式匹配854.1  代数数据类型854.1.1  从代数到类型864.1.2  计数874.1.3  积类型874.1.4  和类型与密封类884.1.5  构造代数数据类型894.2  模式匹配904.2.1  何为模式914.2.2  常见的模式924.2.3  处理嵌套表达式934.2.4  通过Scala找点灵感954.2.5  用when力挽狂澜974.3  增强 Kotlin 的模式匹配994.3.1  类型测试/类型转换994.3.2  面向对象的分解1004.3.3  访问者设计模式1024.3.4  总结1044.4  用代数数据类型来抽象业务1054.4.1  从一个实际需求入手1054.4.2  糟糕的设计1054.4.3  利用ADT1064.4.4  更高层次的抽象1084.5  本章总结110第5章  类型系统1125.1  null引用:10亿美元的错误1125.1.1  null做了哪些恶1125.1.2  如何解决NPE问题1145.2  可空类型1155.2.1  Java 8中的Optional1155.2.2  Kotlin的可空类型1185.2.3  类型检查1215.2.4  类型智能转换1225.3  比Java更面向对象的设计1245.3.1  Any:非空类型的根类型1245.3.2  Any?:所有类型的根类型1275.3.3  Nothing与Nothing?1285.3.4  自动装箱与拆箱1285.3.5  “新”的数组类型1295.4  泛型:让类型更加安全1305.4.1  泛型:类型安全的利刃1305.4.2  如何在Kotlin中使用泛型1315.4.3  类型约束:设定类型上界1335.5  泛型的背后:类型擦除1355.5.1  Java为什么无法声明一个泛型数组1355.5.2  向后兼容的罪1365.5.3  类型擦除的矛盾1385.5.4  使用内联函数获取泛型1395.6  打破泛型不变1405.6.1  为什么List不能赋值给List1405.6.2  一个支持协变的List1415.6.3  一个支持逆变的Comparator1435.6.4  协变和逆变1445.7  本章小结147第6章  Lambda和集合1486.1  Lambda简化表达1486.1.1  调用Java的函数式接口1486.1.2  带接收者的Lambda1496.1.3  with和apply1506.2  集合的高阶函数API1516.2.1  以简驭繁:map1516.2.2  对集合进行筛选:filter、count1526.2.3  别样的求和方式:sumBy、sum、fold、reduce1546.2.4  根据学生性别进行分组:groupBy1566.2.5  扁平化—处理嵌套集合:flatMap、flatten1576.3  集合库的设计1596.3.1  集合的继承关系1596.3.2  可变集合与只读集合1606.4  惰性集合1636.4.1  通过序列提高效率1636.4.2  序列的操作方式1646.4.3  序列可以是无限的1666.4.4  序列与Java 8 Stream对比1666.5  内联函数1676.5.1  优化Lambda开销1686.5.2  内联函数具体语法1696.5.3  noinline:避免参数被内联1716.5.4  非局部返回1726.5.5  crossinline1746.5.6  具体化参数类型1746.6  本章小结175第7章  多态和扩展1767.1  多态的不同方式1767.1.1  子类型多态1767.1.2  参数多态1777.1.3  对第三方类进行扩展1787.1.4  特设多态与运算符重载1787.2  扩展:为别的类添加方法、属性1797.2.1  扩展与开放封闭原则1797.2.2  使用扩展函数、属性1807.2.3  扩展的特殊情况1837.2.4  标准库中的扩展函数:run、let、also、takeIf1867.3  Android中的扩展应用1887.3.1  优化Snackbar1887.3.2  用扩展函数封装Utils1897.3.3  解决烦人的findViewById1907.4  扩展不是万能的1937.4.1  调度方式对扩展函数的影响1937.4.2  被滥用的扩展函数1967.5  本章小结197第8章  元编程1988.1  程序和数据1998.1.1  什么是元编程1998.1.2  常见的元编程技术2018.2  Kotlin的反射2028.2.1  Kotlin和Java反射2028.2.2  Kotlin的KClass2058.2.3  Kotlin的KCallable2068.2.4  获取参数信息2088.3  Kotlin的注解2108.3.1  无处不在的注解2118.3.2  准确控制注解的位置2128.3.3  获取注解信息2138.4  本章小结216潜入篇  Kotlin探索第9章  设计模式2189.1  创建型模式2189.1.1  伴生对象增强工厂模式2199.1.2  内联函数简化抽象工厂2229.1.3  用具名可选参数而不是构建者模式2249.2  行为型模式2289.2.1  Kotlin中的观察者模式2289.2.2  高阶函数简化策略模式、模板方法模式2319.2.3  运算符重载和迭代器模式2359.2.4  用偏函数实现责任链模式2379.2.5  ADT实现状态模式2419.3  结构型模式2449.3.1  装饰者模式:用类委托减少样板代码2459.3.2  通过扩展代替装饰者2469.4  本章小结248第10章  函数式编程24910.1  函数式编程的特征24910.1.1  函数式语言之争25010.1.2  纯函数与引用透明性25110.1.3  代换模型与惰性求值25310.2  实现Typeclass25410.2.1  高阶类型:用类型构造新类型25510.2.2  高阶类型和Typeclass25610.2.3  用扩展方法实现Typeclass25710.2.4  Typeclass设计常见功能25810.3  函数式通用结构设计26210.3.1  Monoid26210.3.2  Monad26410.3.3  Monad组合副作用26910.4  类型代替异常处理错误27110.4.1  Option与OptionT27210.4.2  Either与EitherT27610.5  本章小结279第11章  异步和并发28111.1  同步到异步28111.1.1  同步与阻塞的代价28111.1.2  利用异步非阻塞来提高效率28411.1.3  回调地狱28411.2  Kotlin的Coroutine28611.2.1  多线程一定优于单线程吗28711.2.2  协程:一个更轻量级的“线程”28711.2.3  合理地使用协程28811.2.4  用同步方式写异步代码29011.3  共享资源控制29311.3.1  锁模式29311.3.2  Actor:有状态的并行计算单元29611.4  CQRS架构30211.4.1  Event Sourcing事件溯源—记录对象操作轨迹30211.4.2  Kotlin with Akka Persistence-Actor30411.5  本章小结310遨游篇  Kotlin实战第12章  基于Kotlin的Android架构31412.1  架构方式的演变31412.1.1  经典的 MVC 问题31512.1.2  MVP31612.1.3  MVVM32012.2  单向数据流模型32712.2.1  Redux32712.2.2  单向数据流的优势32912.3  ReKotlin33112.3.1  初见 ReKotlin33112.3.2  创建基于ReKotlin的项目33212.4  解耦视图导航34112.4.1  传统导航的问题34112.4.2  rekotlin-router34212.5  本章小结343第13章  开发响应式Web应用34513.1  响应式编程的关键:非阻塞异步编程模型34513.1.1  使用CompletableFuture实现异步非阻塞34613.1.2  使用RxKotlin进行响应式编程34713.1.3  响应式Web编程框架34813.2  Spring 5:响应式Web框架34913.2.1  支持响应式编程34913.2.2  适配Kotlin35013.2.3  函数式路由35113.2.4  异步数据库驱动35313.3  Spring 5响应式编程实战35413.4  本章小结360
摘要
    第1章认识Kotlin在Java之后,JVM平台上出现了其他的编程语言,Scala和Kotlin可以算是其中的佼佼者。Scala已成为大数据领域的明星,而Kotlin在2017年Google I/O大会之后,也成为安卓平台上潜力巨大的官方支持语言。它们都因被冠以“更好的Java”而为人称道,然而它们采用的却是两种不同的设计理念。本章我们通过对比Java、Scala、Kotlin这3种编程语言各自的发展路线,来认识Kotlin的设计哲学。1.1  Java的发展不得不说,Java是当今最成功的编程语言之一。自1996年问世,Java就始终占据着编程语言生态中很大的份额。它的优势主要体现在:多平台与强大的社区支持。无论是用于Web开发还是用于移动设备,Java都是主流的编程语言之一。尊重标准。它有着严格的语言规范及向后兼容性,因此非常适合开发团队之间的协作,即使组织变动,新人同样可以在相同的规范下快速参与项目开发。然而,随着计算平台的快速发展,平台和业务本身对编程语言提出了更大的挑战。Java的发展也受到环境变化所带来的影响。一方面,多核时代与大数据的到来,使得古老的函数式编程又重新变得“时髦”,Scala、Clojure这种多范式的编程语言开始受到越来越多开发人员的关注和喜爱;另一方面,Java的严格规范也常常引发抱怨。因此,Java必须开始改变。1.1.1  Java 8的探索如果说Java 5引入泛型是Java发展历史上重大的进步,那么Java 8的发布也同样意义深远,它是Java对其未来发展的一次崭新探索。Java 8引入了很多全新的语言特性,如:高阶函数和Lambda。首次突破了只有类作为“头等公民”的设计,支持将函数作为参数来进行传递,同时结合Lambda语法,改变了现有的程序设计模式。Stream API。流的引入简化了日常开发中的集合操作,赋予了Java更强大的业务表达能力,并增强了代码的可读性。Optional类。它为消除null引用所带来的NullPointerException问题,在类型层面提供了一种解决思路。这一次的发布在Java社区引起了不同寻常的反响,因为Java程序员开始感受到另外一种编程范式所带来的全新体验,也就是所谓的函数式编程。拥抱函数式也为Java的发展指出了一个很好的方向。1.1.2  Java未来的样子2016年11月,在欧洲优选的Java峰会上,Oracle的Java语言架构师Brian Goetz分享了关于Java这门语言未来发展的演讲。本次会议优选的收获就是探索了未来Java可能支持的语言特性,它们包含:数据类。值类。泛型特化。更强大的类型推导。模式匹配。以上的语言特性对于初尝函数式编程甜头的Java开发者而言,是十分值得期待的。它们可以进一步解放Java,让开发工作变得更加高效和灵活。比如,一旦Java支持了数据类,我们就可以用非常简短的语法来表示一个常见的数据对象类,如下所示:public class User(String firstName, String lastName, DateTime birthday)而若用如今的JavaBean,则意味着好几倍的代码量,这一切都让人迫不及待。与此同时,或许早有Java程序员开始了JVM平台上另一种语言的研究。这门语言已支持了所有这些新的特性,并在设计之初就集成了面向对象和函数式两大特征,它就是Scala。1.2  Scala的百宝箱Scala是洛桑联邦理工大学的马丁(Martin Odersky)教授创造的一门语言。他也参与了Java语言的发展研究工作,在Java 5中引入的泛型就是他的杰作。事实上,在Java刚发布的时候,马丁教授就开始了Java的改良工作—他在JVM平台探索函数式编程,并发布了一个名为Pizza的语言,那时就支持了泛型、高阶函数和模式匹配。然而,在随后的探索过程中,他渐渐发现Java是一门具有硬性约束的语言,在某些时候不能采用很优的方式来实施设计方案。因此,马丁教授和他的研究伙伴决定重新创造一门语言,既在学术上合理,同时也具备实用价值。这就是开发Scala的初衷。1.2.1  学术和工业的平衡Scala是一门非常强大的编程语言,正如它名字(Scalable,可拓展)本身一样,用Scala编程就像拥有了哆啦A梦的口袋,里面装满了各种编程语言特性,如面向对象、函数式、宏。Scala不仅在面向对象方面进行了诸多的改良,而且拥抱了函数式。因此Scala也吸引了函数式编程社区很多厉害的程序员,他们将函数式编程的思想注入Scala社区,如此将使用Scala进行函数式编程提高到了新的高度。由于Scala设计者学院派的背景,以及Scala某些看似“不同寻常”的语法,使它在发展早期(甚至现在)经常被描述为“过于学院派”,以至于马丁教授在某次Scala大会的演讲时,自嘲“Scala真正的作用是将人引向了Haskell”。然而,真实的Scala却是在不断地探索学术和实用价值两方面的平衡。不可否认的是:Scala已经成为大数据领域的热门语言,明星项目Spark就是用Scala开发的,还有很多其他知名的项目,如Akka、Kafka等。越来越多的商业公司,如Twitter、PayPal、Salesforce都在大量使用这门语言。另外,Scala也确实是一门有着较陡的学习曲线的语言,因为它强大且灵活,正如马丁教授所言,Scala相信程序员的聪明才智,开发人员可以用它来灵活选择语言特性。但学术和工业的平衡始终是一个难题,与Java严格标准相比,Scala的多重选择也常常因复杂而被人吐槽。1.2.2  复合但不复杂那么,Scala真的复杂吗?我们不知听了多少次类似这样的抱怨。在搞明白这个问题之前,我们需要先弄清楚到底什么是“复杂”。在英文中,复杂一词可以联想到两个单词:complex和complicated。实际上它们的含义截然不同,更准确地说,complex更好的翻译是“具有复合性”。Nicolas Perony曾在Ted上发表过一次关于“复合性理论”的演讲。什么是复合性?复合并不是复杂。一件复杂的事物是由很多小部分组成的,每一部分都各不相同,而且每一部分都在这个体系中有其自身的确切作用。与之相反,一个复合的系统是由很多类似的部分所组成的,而且(就是因为)它们之间的相互影响形成了一种宏观上一致的行为。复合系统含有很多互动的元素,它们根据简单的、个体的规则行动,如此导致新特征的出现。马丁教授曾发表过一篇名为《简单还是复杂》的文章,表达过类似的观点。如果对搭积木这件事情进行思考,摩比世界提供了固定的方案,而乐高则提供了无穷的选择。然而,前者的零件种类和数量都比后者要多得的。类似的道理,编程语言可以依靠功能累加来构建所谓的语法,同样也可以通过简单完备的理论来发展语言特性。在马丁教授看来,Scala显然属于后者,它并不复杂,而且非常简单。1.2.3  简单却不容易事实上,函数式编程最明显的特征就是具备复合性。函数式开发做得最多的事情就是对需要处理的事物进行组合。如果说面向对象是归纳法,侧重于对事物特征的提取及概括,那么函数式中的组合思想则更像是演绎法,近似于数学中的推导。“简单”的哲学也带来了相应的代价:这是一种更加抽象的编程范式,诸如高阶类型、Typeclass等高级的函数式特性虽然提供了无比强大的抽象能力,但学习成本更高。它建立了另一种与采用Java面向对象编程截然不同的思维模式。这种思维方式上的巨大差异显然是一个极高的门槛,同时也是造成Scala令人望而却步的原因之一。Scala在选择拥抱函数式的同时,也意味着它不是一门容易的语言,它无法成为一门像Java那样主流的编程语言。事实上,即使很多人采用Scala来进行开发,也还是采用类似Java的思维模式来编程。换句话说,Scala依旧是被当作更好的Java来使用的,但这确实是当今主流编程界优选的诉求。在这种背景下,Kotlin作为一门JVM平台上新兴的编程语言,悄悄打开了一扇同样广阔的大门。1.3  Kotlin—改良的Java2010年,JetBrains产生创造Kotlin的想法。关于大名鼎鼎的JetBrains,想必在业内是人尽皆知,知名的IntelliJ IDEA就是他们的产品之一。拥有为各种语言构建开发工具经验的JetBrains,自然是对编程语言设计领域最熟悉的一群人。当时,一方面他们看到了C#在.NET平台上大放异彩;另一方面,Java相比新语言在某种程度上的滞后,让他们意识到改良Java这门主流语言的必要性。JetBrains团队设计Kotlin所要面临的第一个问题,就是必须兼容他们所拥有的数百万行Java代码库,这也代表了Kotlin基于整个Java社区所承载的使命之一,即需要与现有的Java代码接近兼容。这个背景也决定了Kotlin的核心目标—为Java程序员提供一门更好的编程语言。1.3.1  Kotlin的实用主义Kotlin常常被认为是一门近似于Scala的语言。的确,它们的诞生都源于对Java语言的改良,同时都在面向对象和函数式之间建立起了多范式的桥梁。不可否认的是,Kotlin确实从Scala身上借鉴了许多,就连它的创作团队也表示过:“如果你用Scala感到很开心,那么你并不需要Kotlin。”然而,Kotlin与Scala的设计哲学又十分不同。Kotlin并没有像Scala那样热衷于编程语言本身的研究和探索。相反,它在解放Java的同时,又在语言特性的选择上表现得相当克制。我们说过,Scala旨在成为一门程序员梦想中的语言,它包含了所有你想拥有的语言特性。而Kotlin更加立足现实,它现阶段仍没有宏,也拒绝了很多所谓的高级函数式语言特性。但它在Java 的基础上发展出很多改善生产力的语言特性,如数据类、when表达式(一定程度上的模式匹配)、扩展函数(和属性)、可空类型等,而且它似乎偏好语法糖,比如Smart Casts,因为这可以让编程人员的工程开发变得更加容易。可以看出,Kotlin的自我定位非常清晰,它的目标就是在计算机应用领域成为一门实用且高效的编程语言。如果说Scala的设计理念是more than Java(不仅仅是Java),那么Kotlin才是一门真正意义上的better Java(更好的Java)。1.3.2  更好的Java如果你用Kotlin开发过业务,很快就会意识到它相较于Java的语法更加简洁、高效。比如Kotlin做了这些改良:在很大程度上实现了类型推导,而Java在SE 10才支持了局部变量的推导。放弃了static关键字,但又引入了object,可以直接用它来声明一个单例。而作为比较,Java则必须依靠构建所谓的“单例模式”才能等效表达。引入了一些在Java中没有的“特殊类”,比如Data Classes(数据类)、Sealed Classes(密封类),我们可以构建更深程度上的代数数据类型,结合when表达式来使用。但可能你会问,以上Kotlin的特性,Scala也有,能否可以说前者只是后者的一个子集呢?这种表述其实是不恰当的。其实,Kotlin在致力于成为更好的Java的道路上,不仅仅依靠这些新增的语言特性,它在兼容Java方面做了大量的工作,比Scala走得更远。

蜀ICP备2024047804号

Copyright 版权所有 © jvwen.com 聚文网