自2017年中旬以来,我们已经在Okcupid中使用了188bet金宝搏官网Kotlin,我们的整个Android团队喜欢它。188博金宝电子体育频道如果您一直在开发,甚至研究Kotlin,您意识到它与Java相比更愉快。

我们知道很多好处 - 没有分号,可用的类型,扩展方法等。但是,我认为有许多小隐藏的宝石在语言中,当然,你可以在文档中找到,但并不总是被召唤出来在介绍性Kotlin帖子中。所以我们要为你走过几个!

我们可以将隐藏的宝石构成两类:

  1. 包括方法
  2. 语言特征

包括方法

本节是讨论在Java中不存在的标准库中构建的类别,您可能不知道在Kotlin中。

一个我相信值得越过的一堂课是细绳班级。这是一个阶级,我们都必须在我们的职业生涯中工作,因此了解Kotlin的字符串类的力量非常重要。

首先,让我们乘坐沿着记忆道旅行,并记住我们作为Java开发人员的日子。在Java中,如果我们想与字符串一起使用,我们无法使用内置的Java字符串类,我们会导入Apache Commons.他们的Stringutils类的图书馆。它会给我们一些有用的方法:

stringutils.isblank(“”);// true stryutils.substringbefore(“adam.mcneilly”,“。”);//“adam stringutils.substringawter(”adam.mcneilly“,”。“); //”mcneilly“stringutils.leftpad(”1“,2); //”1“stringutils.cop(”abc“); //“ab”

然而,由于JetBrains的美妙开发人员,以上所有方法都建立在:

val blank =“”.isblank()//还:charsequence?.isnullorblank val first =“adam.mcneilly”.substringBefore('。')//“adam”val last =“adam.mcneilly”.substringawter('。')//“mcNeilly”val withspaces =“1”.padstart(2)//“1”Val Endspaces =“1”.Padend(3,'0')//“100”val dropstart =“adam”。下降(2)//“AM”Val Dampend =“adam”.droplast(2)//“广告”

在这里,您会注意到我们将使用格式的静态方法摆脱Java-Esque方式Helperclass.dosomething(输入),并使用更像kotlin惯用方法以格式调用对象本身上的方法Input.dosomething()。他们有效地相同,kotlin扩展功能基本上只是静态方法的句法糖。

Kotlin Strings课程甚至更多地提供,只是为了突出一些:

“一个\ 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 nullabledestring:string?= null nullableString.OREMPTY()//返回“”

最后两种方法,zipwithnext()orempty()实际上也适用于集合!orempty()是我在Kotlin中的个人最喜欢的方法之一 - 能够采用可燃的字符串或可用的集合,并将其转换为空值(不为NULL)是一个巨大的时间保护程序与elvis运算符(例如elvis运算符)相比:val nonnullstring = nullstring?:“”。注意:您还可以在可用的集合上使用它来返回空列表!

对称

关于在Kotlin跨境工作的伟大事物之一是方法之间的对称性。当然,我可能经常想要在一个角色之前的子字符串,但后面怎么样?也许我想填充一个字符串的开始,但我也可能想要填充结尾。语言开发人员考虑到这一点,并确保我们尽可能多的对称性:

SubstringBefore()子串()isempty()isnotempty()padstart()padent()padend()drop()droplast()trimstart()trimstart()trimend()

注意:作为reddit用户kodablah解释,并不总是完美的对称性。您可能会找到一些例外。

收藏品

在那个笔记上,您可以在Kotlin中的集合中与我们之前无法做到的集合,作为Java开发人员。

类似于Apache Commons,但没有外部依赖,我们有一个收藏品java中的课程有一堆静态方法来做我们想要的东西:

collections.sort(MyList);collections.max(MyList);Collections.min(MyList);collections.Shuffle(MyList);collection.reverse(MyList);集合.swap(MyList,1,2);

与字符串一样,我们不想担心此Java静态方法类型方法,因此您可以以良好的kotlin惯用方式执行以上所有内容:

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

迭代集合

Kotlin提供了很多非常强大的方法来迭代集合。我不仅仅是循环的意思,我的意思是用目的迭代。一个常见的例子是对符合某些条件的项目进行顺序搜索。在Java中,我们习惯于写这个:

公共人员Getadam(列表<人>人){(人人:人){if(person.getname()。等于(“adam”)){返回人;}返回null;}

这是我们在Java中可以做的最好的,而且没有糟糕,但谢天谢地在Kotlin中我们实际上有一个线条方法来做到这一点,只接受我们想要检查的条件:

有趣的getadam(人:列表):人物?{返回persion.firstornull {it.name ==“adam”}}

Firstornull.方法将返回满足提供条件的集合中的第一个项目。如果你看看源代码,您将看到它与我们的Java进行了完全相同的循环。因此,我们保持完全相同的性能,但获得了所有这些伟大的可读性。

这里的选项非常广泛,并且还支持我们在STDLIB周围看到的对称性:

mylist.filter {} mylist.filterisinstance()mylist.filterisinstance()mylist.filternotnull {} mylist.first {} //还:indexoffirst {} mylist.firstornull {} mylist.last {} //还:indexoflast {} mylist.lastornull {} mylist.single {} mylist.singleornull {} mylist.any {} mylist.none {} mylist.none {} mylist.all {} mylist.partition {} // fire ,列表>

我作为一个有趣的小宝石扔了分区 - 它是一种方法,它是一个条件,并返回符合条件的项目列表,以及没有的项目列表。我鼓励你读过收藏品文档,你必然找到一个你以前从未见过的独特的方法,但是以前做过的事情。

语言特征

本节是讨论您在Kotlin语言中可以做的事情,我们无法在Java中做,以及我们如何利用它们以获得额外的生产力。

更高的顺序功能

好的,所以这可能是或可能不是你的标准的“隐藏宝石”,但这取决于他们如何向你呈现。根据这一点文件“lambda表达式和匿名函数是”函数文字“,即未声明的函数,但立即通过作为表达式。”但是,当我查看下面的代码时(来自Java开发人员的角度来看)很难了解发生的事情。我被告知,一个λ是进入另一个函数的函数,但我在这里看不到任何幕布,我将事物传递到:

val alennumbers = mynumberlist.filter {it%2 == 0}

真正发生的是它的好处关键点

在Kotlin中,存在一个惯例,如果函数的最后一个参数接受函数,则可以将相应参数传递的lambda表达式放在括号外。

如果我们查看过滤器的源代码,我们可以看到它采用接受类型T的函数(您列表中的任何类型的项目),并输出布尔值:

公共内联乐趣数组 .filter(谓词:(t) - > boolean):列表 {return filterto(arraylist (),谓词)} val alennumbers = mynumberlist.filter {它%2 == 0}

所以,让我们去一个例子用例。让我们考虑编写一个检查用户是否授予写入存储权限的方法,如果我们想要执行一些回调:

私人乐趣与writepermissive(回调:() - >单位){活动?.let {活动 - > rxpermissions(活动).request(manifest.permission.write_external_storage).subscribe {grailed  - > if(授予){callback(){callback()}}}

由于我们的功能只有一个参数,这是另一个函数,我们可以用一个相当酷的lambda调用它:

withwritepermission {launchgallery()}

我还看到了一个示例,以便在Android上检查API版本:188博金宝电子体育频道

supportslollipop {dosomething()}

然而,这里有一个警告。在Google Io,Jake Wharton解释为什么他们不包括android ktx库中的方法。188博金宝电子体育频道有的原因,我们没有任何方法可以在上面包含别人的块。如果功能性在Android的未来版本中发生变化,并且您需要考虑三个阶段:在棒棒糖之前,棒棒糖之后188博金宝电子体育频道,在这一新的变化之后,您将无法使用上述操作。

所以要小心你在哪里使用这个最后一个参数技巧,并尽量不要将自己编写到一个角落里。

破坏性宣言

我们将在这里谈论的最后一个强大的kotlin功能破坏性,这绝对是没有得到足够信用的东西。

考虑一个用例,其中有一个表示3D坐标的整数数组。在我们旧的Java方式中,我们必须引用每个索引来获取我们想要的东西:

val坐标= arrayof(5,10,15)val x =坐标[0] val y =坐标[1] val z =坐标[2] println(“x坐标:$ x”)println(“y坐标:$ y“)println(”z坐标:$ z“)

然而,由于破坏性,我们可以在Kotlin的一行中完成所有这些。您所要做的就是定义所需的值,并将每个变量名包装在括号内,逗号分隔它们:

val坐标= arrayof(5,10,15)val(x,y,z)= coordinates println(“x坐标:$ x”)println(“y坐标:$ y”)println(“z坐标:$ z”)

为此提供一个很酷的用例是破坏了一个数据类,以便您可以从函数中返回两个项目:

数据类结果(Val结果:int,val状态:状态)有趣功能(...):结果{返回结果(结果,状态)} Val(结果,状态)=函数(...)

您还可以破坏地图条目,这使得遍历地图很多。你不再需要访问entry.key.条目.Value.,您可以在循环中破坏:

val actionsmap:map  = wastmap中的((key,action)的hashmapof(...)){// ...}

在引擎盖下工作的方式是通过添加一个componentn()为您想要破坏的每个字段的功能。这会自动发生数据类,但如果您想在自己的类上执行此操作,则需要编写自己的操作员功能:

类人(VAL名称:字符串,val年龄:int){operator fun组件名称,年龄)=人

你可以拥有尽可能多的componentn()当您需要的函数,但如果您尝试破坏更多的项目,而不是您的组件函数,则会收到错误。

结论

这篇文章中有三个主要的外卖:

  1. 字符串和集合课程在Kotlin比您想到的方式更强大。需要一些时间阅读他们的文档,以及其他常见类别,你一定会用你没有想到的方法感到惊讶。
  2. 函数类型真的很棒,你可以用他们做一些非常漂亮的东西。甚至有更多文档。只要意识到一些使得难以前进的局限性。
  3. 破坏性是Kotlin的较小的秘密之一。你可以拯救自己很多时间!

Kotlin充满了隐藏的秘密,即使除了这里讨论的一切。你有一个最喜欢的宝石吗?伸向我推特!!想在Okcupid加入我吗?188bet金宝搏官网我们正在招聘!