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