美文网首页
kotlin属性方法引用

kotlin属性方法引用

作者: kevinsEegets | 来源:发表于2020-05-12 11:41 被阅读0次

引用不仅仅局限于函数方面,还可以对属性进行引用,返回一个值,类似java中的getters方法。
我们来看下MediaItem的结构:

 data class MediaItem(val title: String, val url: String)

如果有一个MediaItem的列表,我们要根据每个MediaItem的title排序,排完序后打印出每个MediaItem的url,一般的代码会这样写:

  items
    .sortedBy { it.title }
    .map { it.url }
    .forEach { print(it) }

然而,下面的引用风格对我来说更加简洁易懂:

  items
    .sortedBy(MediaItem::title)
    .map(MediaItem::url)
    .forEach(::println)

那么上面的两种写法的字节码有什么不同呢?对比来了:

  Iterable $receiver$iv = (Iterable)items;
$receiver$iv = (Iterable)CollectionsKt.sortedWith($receiver$iv, (Comparator)(new HomeContentFragmentKt$getSortedUrls$$inlined$sortedBy$1()));
Collection destination$iv$iv = (Collection)(new ArrayList(CollectionsKt.collectionSizeOrDefault($receiver$iv, 10)));
Iterator var4 = $receiver$iv.iterator();
 
while(var4.hasNext()) {
   Object item$iv$iv = var4.next();
   MediaItem it = (MediaItem)item$iv$iv;
   String var11 = it.getUrl();
   destination$iv$iv.add(var11);
}
 
$receiver$iv = (Iterable)((List)destination$iv$iv);
Iterator var2 = $receiver$iv.iterator();
 
while(var2.hasNext()) {
   Object element$iv = var2.next();
   String it = (String)element$iv;
   System.out.print(it);
}

引用风格的字节码:

  Iterable $receiver$iv = (Iterable)items;
$receiver$iv = (Iterable)CollectionsKt.sortedWith($receiver$iv, (Comparator)(new HomeContentFragmentKt$getSortedUrls$$inlined$sortedBy$1()));
Collection destination$iv$iv = (Collection)(new ArrayList(CollectionsKt.collectionSizeOrDefault($receiver$iv, 10)));
Iterator var4 = $receiver$iv.iterator();
 
while(var4.hasNext()) {
   Object item$iv$iv = var4.next();
   String var10 = ((MediaItem)item$iv$iv).getUrl();
   destination$iv$iv.add(var10);
}
 
$receiver$iv = (Iterable)((List)destination$iv$iv);
Iterator var2 = $receiver$iv.iterator();
 
while(var2.hasNext()) {
   Object element$iv = var2.next();
   System.out.println(element$iv);
}

可以看到,两者的字节码基本相同。但是引用风格的字节码节省了几个变量,因此是稍微高效一丢丢,当然你也可以不必在乎这些。
下面再展示一些cool的代码,体会下“引用”这个新的feature:

 //1,获取对应类型的,比如下面代码获取到 KProperty<Int>
    var x = 1
    fun main(args: Array<String>) {
        println(::x.get()) // prints "1"
        ::x.set(2)//KMutableProperty<Int>
        println(x)         // prints "2"
    }
    //2,获取 KClass
    val c = MyClass::class

参考文献
https://www.jianshu.com/p/10358883455c
https://antonioleiva.com/function-references-kotlin/

相关文章

  • kotlin属性方法引用

    引用不仅仅局限于函数方面,还可以对属性进行引用,返回一个值,类似java中的getters方法。我们来看下Medi...

  • Kotlin反射

    Kotlin把函数和属性当成“一等公民”,并可通过反射直接获取函数、属性的引用。 一、类引用 Kotlin的类引用...

  • Kotlin的属性和字段

    Kotlin的属性相当于Java的字段再加上getter和setter方法。 一、读写属性和只读属性 Kotlin...

  • Kotlin 笔记 反射

    Kotlin 中函数和属性是一等公民,可以直接引用它们。 要使用reflection需要手动添加kotlin-re...

  • kotlin 基础 Companion Objects 20

    在 kotlin 中没有静态方法和属性,我们想要调用类的方法时候,kotlin给我们提供 componion ob...

  • Kotlin调用Java

    一、属性 Kotlin调用属性实际上就是访问getter、setter方法,Java类只要提供了getter方法,...

  • kotlin接口

    kotlin中的接口与Java8中的类似,既包含方法也包含属性。方法包括抽象方法和普通方法,属性包含抽象属性和普通...

  • Kotlin学习笔记之 7

    7.Kotlin 接口 默认实现kotlin支持接口方法的默认实现,以及支持接口属性的重写接口中的属性无法进行初始...

  • Kotlin函数

    1.函数引用 kotlin中函数引用跟c++中的方法指针很相似,函数引用可以像其他类型的引用一样作为方法的参数和返...

  • ES5 VS ES6

    模块引用 组件化 组件方法 属性类型和默认属性 state

网友评论

      本文标题:kotlin属性方法引用

      本文链接:https://www.haomeiwen.com/subject/mtfbnhtx.html