V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
androidwing
V2EX  ›  Kotlin

有木有对 Kotlin 感兴趣的?

  •  
  •   androidwing · 2016-11-28 09:18:52 +08:00 · 11034 次点击
    这是一个创建于 2696 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Kotlin 对比 Java 不得不说太爽了。在学习之余,想分享给大家,并且给感觉无从下手的朋友们一个参考。

    所以用 Kotlin 开发了一个 App ,并且用了主流的框架:

    MVP+Dagger2+Databinding+Rxjava+Retrofit+Okhttp3

    image

    感兴趣的可以看看哈~ 保证 Kotlin 让你爽翻天。

    https://github.com/githubwing/GankClient-Kotlin

    45 条回复    2017-03-09 20:26:47 +08:00
    sonaive
        1
    sonaive  
       2016-11-28 09:30:07 +08:00
    支持小乐园的小哥
    androidwing
        2
    androidwing  
    OP
       2016-11-28 09:39:02 +08:00
    @sonaive 哦草,大佬您是?
    nicevar
        3
    nicevar  
       2016-11-28 09:46:17 +08:00
    也不一定爽,去年折腾了一段时间的 scala 和 kotlin ,大约去年的这个时候, 1.0 beta 版本出来了,终于憋不住了,就像手上拿了一把新锤子,到处找钉子,于是脑抽了把自己的一个项目转成 Kotlin ,结果搞出不少事情
    whx20202
        4
    whx20202  
       2016-11-28 09:52:55 +08:00
    这个充满妹子的 app 是什么?
    windyboy
        5
    windyboy  
       2016-11-28 09:55:24 +08:00
    我最近也在折腾 ktolin
    感觉文档还是不太好
    后台 api 方面的框架倒是不少,文档做得相当可怜
    安卓还没弄
    xuqd
        6
    xuqd  
       2016-11-28 09:55:40 +08:00
    @nicevar 搞出啥情况,说出来让我们吸取下教训
    blackbbc
        7
    blackbbc  
       2016-11-28 10:06:37 +08:00
    露珠你的 databinding+dagger 能工作吗?
    我前两个月试过 kotlin 然后发现各种编译不过去
    https://youtrack.jetbrains.com/issue/KT-14016
    等什么时候支持的好了 我再转到 kotlin
    ThinkCat
        8
    ThinkCat  
       2016-11-28 10:17:44 +08:00
    用这个东西写了个 web 后台应用( https://github.com/ThinkCats/kot),总体来说是比 java 舒服点,用了一段时间,就搁置了。还是觉得这个语言在进化中,需要成熟稳定。也可能是学的仓促,理解不深。
    ts25504
        9
    ts25504  
       2016-11-28 10:30:25 +08:00
    感觉 kotlin 的 ide 支持还是不够啊, android 应用还要先把 java 转成 kotlin ,怪怪的感觉
    barryhappy
        10
    barryhappy  
       2016-11-28 11:00:50 +08:00
    https://github.com/barryhappy/Gank.Kotlin
    我也发一个……也是 gank.io 的客户端,也是 Kotlin 实现的~
    哈哈,感觉现在 gank 至少有几百个客户端了『开源大法好』。
    cuebyte
        11
    cuebyte  
       2016-11-28 11:03:22 +08:00
    我觉得 kotlin 给 java 添的坑 java8 都填了啊。到底好在?或者有啥学习的必要么?
    androidwing
        12
    androidwing  
    OP
       2016-11-28 11:19:32 +08:00
    @whx20202Gank.io 客户端
    androidwing
        13
    androidwing  
    OP
       2016-11-28 11:19:47 +08:00
    @nicevar 坑确实有,但是也确实方便啊
    androidwing
        14
    androidwing  
    OP
       2016-11-28 11:20:08 +08:00
    @windyboy 需要时间发展嘛
    androidwing
        15
    androidwing  
    OP
       2016-11-28 11:20:30 +08:00
    @blackbbc 可以的,但是要配置 kapt 具体参考源码配置
    androidwing
        16
    androidwing  
    OP
       2016-11-28 11:20:49 +08:00
    @ts25504 直接写 kotlin 就是了
    androidwing
        17
    androidwing  
    OP
       2016-11-28 11:21:36 +08:00
    @barryhappy 哈哈哈哈。。可以


    @cuebyte 光从代码长度上 就秒杀了 java
    lqs
        18
    lqs  
       2016-11-28 11:30:42 +08:00
    公司之前有一个项目用 Kotlin 做后端,还不错,省了很多行代码(和 Java 8 相比)
    nicevar
        19
    nicevar  
       2016-11-28 11:44:18 +08:00   ❤️ 1
    @xuqd 踩了不少坑,一下记不起来了,除去语法变动和一些编译问题,印象比较深刻的是使用 androidannotations 会出现问题,因为这玩意会生成间接代码,另外建议现成的项目不要跟我一样作死,直接在原来的工程上配置开发就好,不要去转换原有的 java 代码,特别是有反射代码的,毕竟是机械转换,要不然会死于各种不明 aoe 。不过对以前写 c++的来说, kotlin 感觉更有亲切感,我会再等几个稳定版本出来再用,坑让年轻人去踩了
    elone
        20
    elone  
       2016-11-28 11:50:40 +08:00 via Android
    感兴趣,正在学
    cuebyte
        21
    cuebyte  
       2016-11-28 11:56:18 +08:00
    @androidwing @lqs Java 语法的确繁琐, Stream 也是很别扭。但是如果 kotlin 并没能提供更好的机制和特性,那就没有特别的理由去学习,因为这门“新”语言除了增加了学习成本,并没有其他新颖之处。大不了多用用 lombok 。

    恕我直言,我觉得 kotlin 之于 java ,可能还不如 coffee 之于 javascript ,更不用说 es2016 、 typescript 了。
    barryhappy
        22
    barryhappy  
       2016-11-28 12:20:47 +08:00
    整体来说,我是很喜欢 Kotlin 的,如果我自己开始一个小项目的话,我会更倾向于使用 Kotlin 而不是 Java 。

    我写过对 Kotlin 的一些看法~
    [为什么要使用 Kotlin ?]( http://www.jianshu.com/p/c4750300b862)

    * 简洁、优雅
    * null 安全
    * 函数、属性扩展
    * 兼容 Java
    * 工具完善
    raysonx
        23
    raysonx  
       2016-11-28 12:31:37 +08:00 via Android
    挺有意思的语言
    xingda920813
        24
    xingda920813  
       2016-11-28 12:52:43 +08:00
    为什么不用 Scala ?个人认为 Kotlin 只是阉割版的 Scala 而已,基本是 Scala 的一个子集。 Kotlin 的优点(代码简洁,与 Java 100% 互操作性, ...)基本 Scala 都有,但 Scala 的很多特性 Kotlin 不具备:隐式转换,反射调用,高阶类型,存在类型,协变 / 逆变, Macro ,模式匹配。
    xingda920813
        25
    xingda920813  
       2016-11-28 12:54:05 +08:00
    Kotlin 的语言设计很多地方看得出借鉴 Scala 、 Swift 的痕迹,例如变量、参数的类型是后置的。
    lqs
        26
    lqs  
       2016-11-28 12:56:14 +08:00   ❤️ 1
    @cuebyte 用半天时间就能把 Kotlin 用熟(因为库都是 JRE 自身的),第二天工作效率的提升省下的时间已经能超过这半天的学习时间了
    cuebyte
        27
    cuebyte  
       2016-11-28 12:57:40 +08:00
    @xingda920813 如果是从后端角度来说的话: 1. 难,学习成本高,也费脑子; 2. 代码风格难统一,能写出 Java 风格也能写出 FP 风格;

    但这个帖子里大多都是 Android 开发者…… Scala 能比 Kotlin 更方便地开发安卓么
    cuebyte
        28
    cuebyte  
       2016-11-28 13:01:39 +08:00
    @lqs 半天就能用熟么……厉害了,半天的话一个库我都用不来。

    我看了一会儿觉熟悉语法就要花好几天时间,概念相近又很容易和 Java 搞混,把代码写错。
    maomaomao001
        29
    maomaomao001  
       2016-11-28 13:10:03 +08:00 via Android
    @cuebyte 可是它根本没有增加学习成本啊~~~ 1 , 2 天,或者 3 , 4 天
    ccjeaty
        30
    ccjeaty  
       2016-11-28 13:11:24 +08:00
    暂时还没用过 @ts25504 这玩意儿是 jb 搞出来的嘛, 理论上 ide 支持应该 ok 的啊.
    maomaomao001
        31
    maomaomao001  
       2016-11-28 13:12:13 +08:00 via Android
    @cuebyte 真的是半天~~
    murmur
        32
    murmur  
       2016-11-28 13:21:09 +08:00
    @barryhappy kotlin 兼容 java 但是语法完全不像 java 啊
    xingda920813
        33
    xingda920813  
       2016-11-28 13:22:55 +08:00
    @cuebyte 1.Scala 作为一门特性较多的语言,学习曲线较为陡峭,这是对的。但其实学习一门新的语言,就是期望工作效率的提升能够 cover 掉学习的时间。 Kotlin 的语法与 Java 差别较大,跟 Scala 反而有点像。而 Kotlin 一样需要学习。 2.这是 OO 与 FP 混合语言的必然结果,除非是 Java 纯 OO 或者 Haskell 纯 FP ,否则代码中很难避免命令式与函数式两种编程风格并存。 这点 Kotlin 和 Scala 是一样的。

    只是想说用 Kotlin 不如用 Scala ,目前我们用 Scala 开发 Android , Kotlin 只在 1 个周边工具中用到。项目中用到了很多 Kotlin 不具备的特性。例如 Scala 的隐式转换, Double 被转换为一个自定义的 MyDouble ,里面有一个 dp 方法,将 dp 数转成 px ,我想表达 48 dp 代表多少 px ,只需要像字面上一样在代码中写下『 48 dp 』就可以了,语义非常直观。

    判断一个集合是不是空集,其他语言可能没有办法只用一个函数实现,因为 List, Set, Map 没有一个公共的父类或实现相同的接口,但他们都有 isEmpty 方法, Scala 的反射调用可以 def isEmpty(o: {def isEmpty: Boolean}) = o == null || o.isEmpty 只要 o 有一个 isEmpty 方法就可以了,并不要求 o 的类型。

    所以说更方便几乎是一定的,因为 Scala 几乎可以说是 Kotlin 的超集, Kotlin 有的 Scala 都有。
    murmur
        34
    murmur  
       2016-11-28 13:24:55 +08:00
    求不要再吹语法特性 这是个最大的谎言 如果语法特性真那么重要 c#为啥不比 Java 火?
    啥时候用 kotlin ?等安卓全转 kotlin 并宣布不更新 java 版之后 5 年吧
    现在多少安卓还在跑 4.x 呢 升 6 都遥遥无期别说 7 了
    cuebyte
        35
    cuebyte  
       2016-11-28 13:25:50 +08:00
    @xingda920813 受教了,敢问贵司开发的 Android 应用是什么?学习学习。
    xingda920813
        36
    xingda920813  
       2016-11-28 13:26:09 +08:00
    另外 Scala 的集合系统也是一大亮点,支持的函数式操作非常多,远比 Java 8 的 Stream 丰富。
    cuebyte
        37
    cuebyte  
       2016-11-28 13:33:26 +08:00
    @xingda920813 想问一下,听说在标准库方面, clojure 是把 java 已有的直接拿来用, scala 是自己重新写。然后现在也有 scala-naitive 这个东西。想问问在你看来其中的优势与潜在的缺点都有哪些?
    CodingPuppy
        38
    CodingPuppy  
       2016-11-28 13:52:44 +08:00
    之前使用 Databinding 配合最新的 kotlin 插件会报错,只能使用旧版本的 kotlin 插件,问下楼主,现在稳定了么
    msputup
        39
    msputup  
       2016-11-28 13:53:25 +08:00
    v2ex 的某个安卓客户端也是 kotlin 实现的。
    xingda920813
        40
    xingda920813  
       2016-11-28 13:58:44 +08:00   ❤️ 1
    Clojure 不了解。 Scala 的标准库的集合部分把 Java 的重新发明了一遍,其他新加了一些方便使用的类,如元组让函数可以便捷地返回 2 个值, Source 类让网络请求或文件读取简略为 1 句话。

    但它的集合分为可变和不可变两种,不可变集合每次操作都会产生一个新的集合, 然后把原来的集合丢弃掉,占用空间和效率方面会差一点,不可变集合与 Java 中的比较相似, Scala 分别针对它们做效率上的优化,例如不可变集合添加一个元素时,返回的新集合会复用前 n - 1 个元素的空间,不会拷贝一次到新集合里。另外他的集合操作兼顾了 OO 和 FP 两种风格,既有 map, flatMap, filter, collect 等 FP 风格的操作符,也有 OO 风格的 take, takeRight (返回头 n 个或 尾 n 个)等操作符。

    另外,不同于 Kotlin 这种因为 Java 原始类型有很多弊端就一刀切的都用 kotlin.* 类不同, Scala 虽然也是 scala.Int ,但他在运行期会尽量是一个 JVM 上的原始 int ,尽量避免装箱以提高性能。同时 Int 可以被隐式转换为一个 RichInt ,提供了很多实用的方法,这是性能与实用性兼顾的例子。

    Scala 自己重新写的优势我感觉是不把人当傻子吧,不是限定使用一种方式完成一件事。而是提供很多选择给你自己选,然后分别对每一种进行特定的优化,集合和对待原始类型的态度就是例子。

    缺点是可能有运行时开销和体积的 overhead , Scala 被编译为 Java 字节码,受限于 Scala 在 JVM 上的实现方式,生成的 class 文件众多,每个 class 里面自动生成的方法也比 Java 多很多。另外 Scala 的标准库体积过大。这两点在 Android 上其实很致命(有 ProGuard 会好一点)。

    scala-native 看起来很不错,能够在 bare metal 上运行 Scala ,感觉如果成熟的话应该会很厉害。这样 Scala 就有了编写接近底层的一些东西的可能性。
    sonaive
        41
    sonaive  
       2016-11-28 20:43:59 +08:00
    @androidwing 我啊,小乐园的潜水人员啊。
    SoloCompany
        42
    SoloCompany  
       2016-11-29 02:00:35 +08:00
    @xingda920813 我和你的看法正好相反, scala 和 kotlin 根本不具备有可比性,一个是重造了所有轮子导致无可避免的融合困难只能依赖转换,一个是什么都从实用性出发,所有内容和 JRE 几乎都是可重用的,完全融合和互操作;我无法想象如何在 andriod 上引入这么重的一个底层而控制应用的体积;在一点,你也是用过 kotlin 的,难道不知道 kotlin 的 Int 在允许的情况下,生成的字节码都是 int 吗
    deadEgg
        43
    deadEgg  
       2016-11-29 09:20:42 +08:00
    不多不少。。
    kotlin 自从我接触一年了
    如我预测一般,没火 23333333
    xingda920813
        44
    xingda920813  
       2016-11-29 09:45:47 +08:00
    @SoloCompany 1.个人更喜欢 Scala 的设计哲学; 转换基本只有方法返回的是 Java 集合时需要用 scala.collection.JavaConverter 转换一下,或者 import scala.collection.JavaConversion, 将 Java 集合隐式转换为 Scala 集合,这点对开发者不透明感受比较明显之外,其他的时候感觉跟 Java 的互操作性还可以;

    2.Android 上 Scala 标准库的体积是个问题,未混淆的情况下, 2.11.8 版本的 scala-library 有 50794 个方法, Dex 中占的体积为 5152 KB ,相比 1.0.5-2 版本的 kotlin-stdlib 有 5703 个方法, Dex 中占的体积为 1011 KB ,所以必须使用 Proguard 和 MultiDex 。我们的应用是因为要引入导航 SDK , so 库使 APK 变大了约 10 MB 左右,相比之下,混淆过的 Scala 类库 (大部分的类可除去) 占用的体积相对于整个 APK 没有这么明显。当然,体积比较敏感的还是 Kotlin 更小一些;

    3.抱歉,不知道的情况下就乱黑了 Kotlin 。只要性能和 Int 上的实用方法兼具,就是极好的。
    sing1ee
        45
    sing1ee  
       2017-03-09 20:26:47 +08:00
    我们后端服务,也转向 kotlin 了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3736 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:03 · PVG 13:03 · LAX 22:03 · JFK 01:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.