Kotlin使用总结(二)

115 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

  • Kotlin 中 infix 关键字的原理和使用场景?

    infix语法通过反编译Java代码之后可以看到主要实现方法是通过静态方法来实习的

    public static final void too(@NotNull String $this$too, @NotNull String str) {
          Intrinsics.checkNotNullParameter($this$too, "$this$too");
          Intrinsics.checkNotNullParameter(str, "str");
     }
    

    infix主要使用在通过扩展一些类的方法,并且方法参数列表只有一个参数时,可以用来简化语法

    infix  fun String.too(str:String){
    
    }
    //使用
    "test1" too "test2"
    
  • 在 Kotlin 中,何为解构?该如何使用?

//kotlin中的解构声明语法
val (name,age) = Person("tony",23)
/*
 * (name,age)就为解构声明语法,是将相应类进行拆解并将其赋值给对应变量
 */

在Kotlin中数据类可以直接采用解构声明语法,普通类如果想使用解构,就需要手动实现对应属性的ComponentN方法,并且需要operator修饰符

特殊注意:

//lambda中的解构
fun main() {
    val book = Book("gone with the wind", 10.0f)
    showBookInfo(book) { (name, price) -> //解构处,函数具体实现在下面
        println("-> name: $name")
        println("-> price: $price")
    }
}

fun showBookInfo(book: Book, block: (Book) -> Unit) {
    book.run(block)
}

val list = listOf<Int>(1,2,3,4,5,6,7)
/**
* 将集合转换成Sequence之后迭代器会共享
*/
list.asSequence()
     .map { print(it) }
     .forEach {  print(it) }
/**
* 每一个迭代都会产生一个迭代器
*/
 list.map { print(it) }
     .forEach{ print(it) }

将上面代码通过反编译成Java之后可以明显看到差别,将list转换成Sequence之后遍历操作的所有迭代器是共享的,但是list自身的遍历操作每一个操作都会创建一个迭代器

Sequences允许 map 转换一个元素后,立马将这个元素传 递给 filter操作 ,而不是像集合(lists) 那样,等待所有的元 素都循环完成了map操作后,用一个新的集合存储起来, 然后又遍历循环从新的集合取出元素完成filter操作。

  • 说说 Kotlin中 的 Any 与Java中的 Object 有何异同?

    Any是Kotlin类结构的根,而对应Java中类结构的跟就是Object,但是两个根类中存在的方法不同,Any中只存在hashCodetoStringequals三个方法并提供给子类重写,但是Object类中存在的方法就不止Any中的三个,并且Kotlin中的Any类只存在编译器,在运行期就会被转换为Object,并且在Kotlin中可以将Any强转为Object,,可以调用object中的相关方法

  • Kotlin中的数据类型有隐式转换吗?为什么?

    在kotlin中不存在数据类型的隐式转换,在Kotlin中,它是一种强调类型安全的语言,针对类型的检查非常严格,对于不同类型的赋值是禁止的,如果需要进行数据类型的转换必须显示的调用转换函数进行转换

  • 分别通过对象表达式 object 和 lambda 表达式实现的函数式接口内部有何不同?

    /*
    SAM接口(抽象方法只能存在一个)
    SAM定义格式:fun interface 接口名{
    	抽象方法名
    }
    */
    
    fun interface OnClickListener{
        fun onClick()
    }
    fun setOnClickListener(clickListener: OnClickListener){
        clickListener.onClick()
    }
    fun main() {
        setOnClickListener { 
        	//onclick函数实现
        }
    }
    /**对象表达式**/
    interface OnClickListener{
        fun onClick()
    }
    fun main() {
        setOnClickListener (object:OnclickListener(){
            override fun onClick(){
                
            }
        })
    }
    

    SAM只适用与接口中只有一个抽象方法的时候可以省略对象表达式实现的过程,但是如果存在多个回调情况SAM就不适合用在这种情况,就可以适用对象表达式或者是适用多个Lambda进行回调

  • Kotlin 中集合遍历有哪几种方式?

        val list = listOf<Int>(0,1,2,3,4,5)
    
        /**
         * 迭代器遍历
         */
        val inter = list.iterator()
        while (inter.hasNext()){
            inter.next()
        }
    
        /**
         * 列表扩展方法 Foreach遍历
         */
        list.forEach { param ->
            print(param)
        }
    
        /**
         *手动实现foreach
         */
        for (it in list){
            print(it)
        }
    
        /**
         * 步进器控制索引进行遍历
         */
        for (it in 0..list.size){
            list[it]
        }