譯 探索 Kotlin 的隱性成本(第三部分)

2021-09-22 23:42:31 字數 4458 閱讀 6894

本文講的是【譯】探索 kotlin 的隱性成本(第三部分),

譯文出自:掘金翻譯計畫

譯者:phxnirvana

校對者:zhiw、feximin

class example
public final class example ;

@notnull

public final string getp

() public final void setp(@notnull string var1)

}

class stringdelegate 

return result

}}

class example
來替代class實現乙個單例委託。

object fragmentdelegate 

}

來實現。kotlin 已經提供了內建的擴充套件方法來允許將mapandmutablemap例項用作委託,屬性名作為其中的鍵。

private var maxdelay: long by sharedpreferencesdelegate()

。 是乙個在第一次讀取時通過給定的 lambda 值來計算屬性的初值,並返回唯讀屬性的委託。

private val dateformat: dateformat by lazy
public fun lazy(initializer: () -> t): lazy= synchronizedlazyimpl(initializer)

public fun lazy(mode: lazythreadsafetymode, initializer: () -> t): lazy=

when (mode)

將提供相對耗費昂貴的 雙重檢查鎖 來保證一旦屬性可以從多執行緒讀取時初始化塊可以安全地執行。

來代替,從而避免使用鎖的額外開銷。

val dateformat: dateformat by lazy(lazythreadsafetymode.none)

介面的方法。建立區間的主要方法是..操作符方法。

!in操作符實現包含和不包含。

if (i in 1..10)
if(1 <= i && i <= 10)
表示式中:

val message = when (statuscode)
private val myrange get() = 1..10

fun rangetest(i: int)

}

private final intrange getmyrange

() public final void rangetest(int i)

}

的方法也無法避免這個物件的建立。這是 kotlin 1.1 編譯器可以優化的乙個點。至少通過這些特定的區間類避免了裝箱操作。

if (name in

"alfred".."alicia")

if(rangeskt.rangeto((comparable)"alfred", (comparable)"alicia")

.contains((comparable)name))

迴圈用乙個更短的表示式替代。

for (i in 1..10)
int i = 1;

byte var3 = 10;

if(i <= var3)

++i;

}}

中綴方法來代替..

for (i in 10 downto 1)
int i = 10;

byte var3 = 1;

if(i >= var3)

--i;

}}

方法結合區間:

for (i in (1..10).reversed())
intprogression var10000 = rangeskt.reversed((intprogression)(new intrange(1, 10)));

int i = var10000.getfirst();

int var3 = var10000.getlast();

int var4 = var10000.getstep();

if(var4 > 0)

} else

if(i < var3)

while(true)

i += var4;

}

中綴方法來操作遞進的步驟,即使只有一步:

for (i in 1..10 step 2)
屬性時會通過對邊界和步長的小小計算來決定準確的最後值。在上面的**中,最終值是 9。

中綴函式對於迭代也很有用,該函式(執行結果)不包含最大值。

for (i in 0 until size)
intrange var10000 = rangeskt.until(0, size);

int i = var10000.getfirst();

int var1 = var10000.getlast();

if(i <= var1)

++i;

}}

與此同時,可以通過這樣寫來優化**:

for (i in 0..size - 1)
迴圈內部的迭代,最好只用區間表示式的乙個單獨方法來呼叫..downto()來避免額外臨時遞進物件的建立。

迴圈的替代,使用區間內聯的擴充套件方法foreach()來實現相似的效果可能更吸引人。

(1..10).foreach
iterable $receiver

$iv = (iterable)(new intrange(1, 10));

iterator var1 = $receiver

$iv.iterator();

while(var1.hasnext())

迴圈而不是區間上的foreach()方法來避免額外建立乙個迭代器。

擴充套件屬性來生成陣列和collection的區間。

val list = listof("a", "b", "c")

for (i in list.indices)

的迭代得到了編譯器的優化:

list list = collectionskt.listof(new string);

int i = 0;

int var2 = ((collection)list).size() - 1;

if(i <= var2)

++i;

}}

擴充套件屬性。

inline val sparsearray<*>.indices: intrange

get() = 0..size() - 1

fun printvalues(map: sparsearray)

}

public static final void printvalues(@notnull sparsearray map) 

++i;}}

}

擴充套件屬性:

inline val sparsearray<*>.lastindex: int

get() = size() - 1

fun printvalues(map: sparsearray)

}

原文發布時間為:2023年7月31日

記憶體資料集產生的隱性成本

當我們要對資料做一些非常規的複雜運算時,通常要將資料裝入記憶體。現在也有不少程式語言提供了記憶體資料集物件及基本的運算方法,可以較方便地實現這類運算。不過,如果對記憶體資料集的工作原理了解不夠,就可能寫出低效的 我們看資料集的產生。比如要生成乙個 100 行 2 列的資料集,第一列 x 為序號,第二...

企業呼叫中心中的隱性成本

很過企業的呼叫中心,特別是中小企業呼叫中心,都採用降低系統成本或節省勞動力成本的方式對成本進行控制,但是這往往會影響企業丟失呼叫中心運作中最重要的服務質量和效率優勢,導致客戶滿意度下降,企業評價降低。這就是 抓顯性成本,丟 優勢 的典型例子。對於企業來說,建立呼叫中心的目的,就是要增強企業客戶服務,...

再論資訊化的隱性成本

今天看到這一篇文章,是關於資訊化的隱性成本的話題,覺的有些道理,但其實細看,更多地發現是站在軟體商的角度來說這個問題的,在銷售萌芽階段 選型階段 招標階段,這些成本是必須的,而且這些所有的環節都將是軟體實施成功的保證,如 選型不合理將導致實施失敗是乙個顯而易見的問題,同時,由於招標階段的 不合理,導...