美文网首页
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属性方法引用

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