kotlin属性方法引用

2020-05-12  本文已影响0人  kevinsEegets

引用不仅仅局限于函数方面,还可以对属性进行引用,返回一个值,类似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/

上一篇 下一篇

猜你喜欢

热点阅读