Android如何正确的截取字符串/emoji子串.

这是一个简单的不能再简单的问题,然而,就是这样简单的常见问题,往往会被忽视,从而给未来的某一天埋坑。

大多数编程语言都提供了built-in 截取字符串的方法。

比如 Python最为简单直观,比如从”Hello, World!” 中提取出 World 可以通过下标直接获取

text = "Hello, World!"
substring = text[7:12]
print(substring) #print World

 在 JS 中,String 也提供

text = "Hello, World!"
substring = text.substring(7,12)
print(substring) //print 'World'

在 Android 中,Kotlin 和 Java 的 String 同样有类似的方法:

val text = "Hello, World!"
val substring = text.substring(7,12)
print(substring) //print 'World'

相信你也一定写过上面的代码,但是真的会如你的预期得到想要的结果吗?

一个字符串的下标,到底表示的是什么?

Continue reading “Android如何正确的截取字符串/emoji子串.”

Kotlin 范型中的in 和out 是什么?

我们看一些源码发现,一些源码,在范型前面添加了一些关键字 in 或者 out,这又是什么呢?比如 kotlin内置的 Comparable.kt

再比如,Collections.MutableIterable 接口

为什么会有一些加in,有一些加out 呢?了解这个之前我们来看下

范型是什么?

泛型(Generics)是一种允许类、接口和方法操作任意类型(类型参数)的特性。泛型提供了一种类型安全的方式来处理对象集合和其他数据结构,而无需在编译时指定具体的类型。

举一个栗子:

Continue reading “Kotlin 范型中的in 和out 是什么?”

Kotlin 中遍历List的N种方式

最近开发使用Kotlin确实挺爽的,就在于这门语言足够现代化,和JetBrains家的编辑器结合起来更是无敌了,自动提示,编译优化都是很实用的,但这样基本也脱离不了这个生态了,话说今天使用List的遍历,居然有六种方式,使用哪种方式都可以。这样虽然看起来很庞大,看起来很难记的样子,但是好在编译器+idea足够聪明,记住一两种就OK了。这有点像是我们学习英语,随着对语义的更加紧准的表达,英文单词拓展到了十几二十万个。(方便的同时也会加大人们的记忆负担)

方式0

    brandList.forEach {
        println(it)
    }

方式1

    for (brand in brandList) {
        println(brand)
    }

方式2

  for (index in 0 until brandList.size) {
        println("$index:${brandList[index]}")
    }

方式3

    for (index in 0..brandList.lastIndex) {
        println("$index:${brandList[index]}")
    }

方式4

    for (index in brandList.indices) {
        println("$index:${brandList[index]}")
    }

方式5

    brandList.forEachIndexed { index, brand ->
        println("$index:${brand}")
    }