我们一直在使用科特林在OkCupid距今约2017年中188bet金宝搏官网期,和我们整个Android团队喜欢它。188博金宝电子体育频道如果你一直在开发中,甚至研究科特林,你知道它是如何更愉快相比,去渣。

我们知道有很多的好处 - 没有分号,可空类型,扩展方法,等等。但是,我认为在这,当然,你可以在文档中找到了语言的数字小隐藏的宝石,但并不总是叫出来在介绍科特林职位。所以,我们正在经历一对夫妇走为您服务!

而不是让这个科特林提示和技巧的大杂烩,我们就可以构建隐藏的宝石分为两类:

  1. 方法包括
  2. 语言功能

方法包括

这部分是讨论建设成为标准库类,没有在Java中存在的方法,你可能不知道的科特林。

字符串

一类,我认为是值得一去了是类。这是一类,我们都必须努力在我们的事业,所以要知道科特林的String类的力量是非常重要的。

首先,让我们走一趟下来内存车道,并记住我们的日子,作为一个Java开发人员。在Java中,如果我们想用绳子工作要做的事情,我们无法内置在Java中的String类做,我们会导入Apache的百科全书图书馆为他们的StringUtils类。它会给我们一些有用的方法:

StringUtils.IsBlank(”“);//真StringUtils.SubstringBefore( “Adam.McNeilly”, “”);// “亚当StringUtils.SubstringAfter(” Adam.McNeilly “”。 “); // ”McNeilly“ StringUtils.LeftPad(” 1" ,2); // “1” StringUtils.Chop( “ABC”); // “AB”

然而,由于开发商妙在JetBrains公司,所有这些上述方法是建立在:

VAL空白= “” .isBlank()//另外:?的CharSequence .isNullOrBlank VAL第一= “Adam.McNeilly” .substringBefore(”。 ')// “亚当” VAL最后= “Adam.McNeilly” .substringAfter('。“)// “McNeilly” VAL withSpaces = “1” .padStart(2)// “1” VAL endSpaces = “1” .padEnd(3, '0')// “100” VAL dropStart = “亚当”。下降(2)// “上午” VAL dropEnd = “亚当” .dropLast(2)// “广告”

在这里你会发现,我们摆脱使用静态方法与格式的Java式的方式HelperClass.doSomething(输入),并使用调用对象本身上的方法在该格式的更科特林惯用的方法input.doSomething()。他们有效地是同样的事情,科特林扩展功能对于静态方法基本上只是语法糖。

甚至还有更多的科特林串类提供,只是强调几点:

“A \ NB \ NC” .lines()// [A,B,C] “One.Two.Three” .substringAfterLast(”。 ')// “三”, “One.Two.Three” .substringBeforeLast('。')// “One.Two”, “ABCD” .zipWithNext()// [(A,B),(B,C),(C,d)] VAL nullableString:字符串?= NULL nullableString.orEmpty()//返回 “”

最后两个方法,zipWithNext()orEmpty()实际上也适用于集合,以及!orEmpty()是在科特林我个人最喜欢的方法之一 - 能够采取可为空字符串或为空的收集,并将其转换为空值(不为null)是相对于一个如Elvis操作符替代节省大量的时间:VAL nonNullString = nullString? “”。注意:您也可以使用此上可空集合返回一个空列表!

对称

一个关于科特林全线工作的伟大的事情是方法之间的对称性。当然,我会经常想一个字符前的子字符串,但对于后?也许我想垫一个字符串的开始,但我还可以想垫片的一端。语言开发了这方面的考虑,并确保我们有尽可能多的对称性可能:

substringBefore()substringAfter()的isEmpty()isNotEmpty()padStart()padEnd()降()dropLast()trimStart()trimEnd()

注:由于reddit的用户Kodablah说明,还有并不总是完美的对称性。您可能会发现一些例外。

集合

关于这一点,有很多,你可以在科特林集合,我们以前无法完成,因为Java开发人员做的。

类似Apache的百科全书,但是没有外部的依赖,我们有一个集合类在Java中其中有一堆的静态方法做我们想做的事情:

Collections.sort(myList中);Collections.max(myList中);Collections.min(myList中);Collections.shuffle(myList中);Collections.reverse(myList中);Collections.swap(myList中,1,2);

与弦乐,我们不希望这个Java静态方法类型的方法担心,这样你就可以做所有的上面漂亮的科特林惯用方式:

myList.sort()myList.max()myList.min()myList.shuffle()myList.reverse()myList.swap(1,2)

遍历集合

科特林提供了很多真正有效的方法来遍历集合。我并不仅仅意味着for循环,我的意思是迭代有目的的。一个常见的例子会做对于满足一定条件的项目顺序搜索。在Java中,我们已经习惯了有写这篇文章:

公众人物getAdam(名单<人>人){对(人的人:人){如果(person.getName()等于( “亚当”)){回报的人;}}返回null;}

这是我们可以在Java中做的最好的,而不是可怕的,但幸运的是在科特林我们实际上有一个行的方法来做到这一点,只是被动地接受,我们要检查的条件:

有趣getAdam(人:名单<人>):人吗?{返回people.firstOrNull {it.name == “亚当”}}

firstOrNull方法满足提供条件的集合中返回的第一个项目。如果你看一下源代码,你会看到它完全一样的事情作为我们的Java for循环。所以我们保持完全相同的性能,但获得这一切的伟大的可读性的。

这里的选项是相当广泛的,并且也支持我们的周围看到STDLIB的对称性:

myList.filter {} myList.filterNot {} myList.filterIsInstance()myList.filterNotNull {} {myList.first} //另外:indexOfFirst {} myList.firstOrNull {} {myList.last} //另外:indexOfLast {} myList中.lastOrNull {} myList.single {} myList.singleOrNull {} myList.any {} myList.none {} myList.all {} {myList.partition} //对<列表,列表>

我在分区扔一个有趣的小宝石的 - 这是发生在一个条件,并返回满足条件的项目清单,并没有项目列表的方法。我建议你通过阅读集合文档,你一定会发现你从来没见过一个独特的方法,但确实你以前需要的东西。

语言功能

这部分是讨论的东西,你可以在科特林语言做到这一点,我们无法用Java做的,我们如何利用这些额外的生产力。

高阶函数

好了,所以这可能会或可能不会是一个“隐藏的宝石”你的标准,但是这取决于他们是如何呈现给大家。按照文件,“Lambda表达式和匿名函数是‘函数文本’,即函数不被声明,但立即作为表达传递”。然而,当我在看下面的代码(从一个Java开发者的角度来看),这是很难理解发生了什么。有人告诉我,一个lambda是进入其他功能的功能,但我没看到任何括号,我是路过的东西到:

VAL evenNumbers = myNumberList.filter {它%2 == 0}

什么是真正发生的事情是这样做的好处重点

在科特林,有一个惯例,如果一个函数的最后一个参数接受一个函数,被传递为相应参数可以被放置在括号外的λ表达式。

如果我们看一下对过滤器的源代码,我们可以看到它发生在接受一个类型T(无论项目的类型是在您的列表)功能,并输出一个布尔值:

公共直列乐趣阵列<出T> .filter(谓词:(T) - >布尔):列表 {返回filterTo(ArrayList的(),谓词)} VAL evenNumbers = myNumberList.filter {它%2 == 0}

所以,让我们通过一个例子用例此。让我们考虑写一个检查用户是否已获准写入存储的方法,如果他们有,我们要进行一些回调:

私人乐趣withWritePermission(回调:() - >单元){活动。让{活动 - > RxPermissions(活动).request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe {理所当然 - >如果(授予){回调()}}}}

因为我们的函数只有一个参数,这是另一种功能,我们可以用一个很酷的拉姆达称之为:

withWritePermission {launchGallery()}

我也看到的例子,说明这在Android检查API版本:188博金宝电子体育频道

supportsLollipop {doSomething的()}

然而,有需要注意的这里的警告。在谷歌IO,杰克沃顿解释他们为什么不包括像,在Android KTX库的方法。188博金宝电子体育频道是的原因,我们没有任何办法,包括上述的其他块。如果功能变化的Android未来的版本中,你需要考虑三个阶段:棒棒糖,棒棒糖之后,这种新的变化后188博金宝电子体育频道,你不能够做​​到这一点与上述前会。

在您使用这个最后一个参数招,尽量不要自己的代码到一个角落所以才要小心。

解构声明

最后一个功能强大的科特林功能,我们打算约在这里谈的解构,这是肯定的东西,它没有得到足够的信贷。

考虑,你必须代表三维坐标整数数组的使用情况。在我们旧的Java方法,我们不得不引用每个单独的索引来得到我们想要的东西:

VAL坐标= arrayOf(5,10,15)VAL X =坐标[0] VAL Y =坐标[1] VAL Z =坐标[2]的println( “X坐标:$ X”)的println(“Y坐标:$ Y“)调用println(” Z坐标:$ Z“)

然而,由于解构,我们能做到的是,在科特林一行。所有你需要做的就是确定你想要的值,然后包裹在括号内的每个变量的名称和逗号分隔它们:

VAL坐标= arrayOf(5,10,15)VAL(X,Y,Z)=坐标的println( “X坐标:$ X”)的println( “Y坐标:$ Y”)的println( “Z坐标:$ Z”)

清凉的使用情况,这是一个解构数据类,这样就可以从一个函数返回两个项目:

数据类结果(VAL结果:诠释,VAL状态:状态)功能的乐趣(...):结果{返回结果(结果状态)} VAL(结果状态)=函数(...)

您也可以解构映射条目,这使得遍历映射要好很多。你不再需要访问entry.keyentry.value,你可以解构你的循环中:

VAL actionsMap:地图<字符串,动> = hashMapOf(...)为(在actionsMap(键,动作)){// ...}

引擎盖下其工作原理是通过添加componentN()功能要解构每个字段。这是自动供我们使用数据类,但如果你想这样做对你自己的类,你需要编写自己的操作功能:

类Person(VAL名:字符串,VAL年龄:智力){操作乐趣COMPONENT1():字符串{回报名}操作乐趣COMPONENT2():诠释{回报年龄}} VAL人=人( “亚当”,25)VAL(姓名,年龄)=人

你可以有许多componentN()功能根据您的需要,但如果你试图解构更多的项目比你对组件的功能,你会得到一个错误。

结论

有这个职位三个主要外卖:

  1. 字符串和集合类的方式更强大的科特林比你想象的。花一些时间,通过他们的文档,以及其他公共类阅读,你一定会跟你完全不知道存在的方法感到惊讶。
  2. 有函数类型真的很棒,你可以做一些很花哨的东西与他们。甚至还有更该文档。只是要注意一些限制,使其难以前进。
  3. 解构是科特林的鲜为人知的秘密之一。您可以节省大量的时间与它!

科特林充满了隐藏的秘密,甚至超越这是这里所讨论的一切。你有最喜欢的宝石?伸手给我上推特!想和我一起在OkCupid?188bet金宝搏官网我们正在招聘!