簡體   English   中英

kotlin 中的 vararg 沒用嗎?

[英]Is vararg in kotlin useless?

我正在考慮 kotlin 中的 vararg(可變參數)選項。我知道它在 kotlin 之前在 java 之前就在這里,但實際上我從來沒有真正理解使用它的好處。 例如,如果我想讓我的 function myFun() 獲取可變數量的 arguments(比方說字符串),我將以一種獲取字符串列表的方式創建 myFun()。 我看不出有任何理由使用 vararg。

在 List 上使用 vararg 有什么好處,我錯過了什么嗎?

vararg使您可以自由調用 function 和無限數量的 arguments 而無需將它們包裝在集合中。 使用List類型的參數,您控制的不僅僅是 arguments,例如可變性。

這是更自以為是的答案。

你是對的,傳遞列表是避免vararg的一種選擇。

對於作為 function 的實施者的您而言,沒有真正的區別,但對於消費者而言卻是。 是function的設計題。 您希望您的客戶如何調用您的功能。

傳遞列表會強制調用者首先創建一個列表,並在將所有項目傳遞給 function 之前用所有項目填充它。

fun foo(list: List<Int>) { ... }
val list: List<Int> = listOf(1,2,3,4,5)
foo(list)

如果您提供采用vararg參數類型的 function,則調用該 function 的方式會發生變化。

fun bar(vararg items: Int) { ... }
fun bar(1) // just passing one parameter
fun bar(1,2,3) // or maybe three, etc.

兩種方式都有它們的用例。

kotlin 參考 function 帶可變參數並轉換數組<out to list<out< div><div id="text_translate"><p> 我已經根據這個主題<a href="https://stackoverflow.com/questions/62260177/kotlin-geneirc-with-vararg-parameter" rel="nofollow noreferrer">基本問題提出了問題</a></p><p>所以,我想提前問一下。 有人用數組和列表回答了這個問題</p><pre>Class Test&lt;T,V&gt;{ var functionPara:(()-&gt;T)? = null var recallFunctionWithFunction:( (Array&lt;out T&gt;) -&gt; V)? = null constructor(value: ()-&gt;T, recallFunctionWithFunction: (Array&lt;out T&gt;) -&gt; V ){ this.functionPara = value this.recallFunctionWithFunction = recallFunctionWithFunction } inline fun &lt;reified T, V&gt; compose(crossinline f: (Array&lt;out T&gt;) -&gt; V, vararg g: () -&gt; T): () -&gt; V { val results = g.map { it() } return { f(results.toTypedArray()) } } fun &lt;T, V&gt; compose(f: (List&lt;out T&gt;) -&gt; V, vararg g: () -&gt; T): () -&gt; V { val results = g.map { it() } return { f(results) } } } fun runCompose(){ compose(functionPara,recallFunctionWithFunction).invoke() }</pre><p> 但我發現,當我引用帶有 vararg 參數的 function 時</p><pre>fun functionA(vararg:Observable&lt;Any&gt;):LiveData&lt;Boolean&gt;{ } fun functionB():Observable&lt;Any&gt;{ }</pre><p> 當我執行類似::functionA 的操作時,A 的類型將是Array&lt;out Observable&lt;Any&gt;&gt;-&gt;LiveData&lt;Boolean&gt;因此,當我執行類似操作時</p><p>Test&lt;Observable&lt;Any&gt;,LiveData&lt;Boolean&gt;&gt;(::functionB,::functionA).runCompose()</p><p> <strong><em>情況 1</em></strong>如果我使用 compose function 並接受 List 類型,它將顯示類型不匹配,因為引用::functionA 將返回 Array</p><p><img src="https://i.stack.imgur.com/X3k3A.png" alt="圖片1"></p><p> <strong><em>情況 2</em></strong>如果我使用 compose function 並接受 Array 類型,它將顯示錯誤</p><p>不能使用“T”作為具體類型參數。 改用 class</p><p><img src="https://i.stack.imgur.com/Z2iwJ.png" alt="圖片2"></p><p> 在上一篇文章中,有人回答我將數組轉換為列表。 但是如何將引用 function 與 vararg 參數與原始Array&lt;out to List &lt;out ? 當我引用 function 之類的 function 時,類型必須是Array&lt;out但我想將其插入到 compose function 中。 我必須轉換它。 任何人都可以幫忙嗎? 我在那兒呆了很長時間。 希望有人能救我!!</p></div></out>

[英]kotlin reference function with vararg parameter and convert Array<out to List<out

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 kotlin 中的字符串格式和可變參數 引用vararg函數參數Kotlin Kotlin-vararg-&gt;更改查詢參數值 將vararg參數傳遞給Kotlin中的另一個函數時編譯時間錯誤 如何在Kotlin的枚舉中檢索用vararg聲明的參數的值 kotlin 參考 function 帶可變參數並轉換數組<out to list<out< div><div id="text_translate"><p> 我已經根據這個主題<a href="https://stackoverflow.com/questions/62260177/kotlin-geneirc-with-vararg-parameter" rel="nofollow noreferrer">基本問題提出了問題</a></p><p>所以,我想提前問一下。 有人用數組和列表回答了這個問題</p><pre>Class Test&lt;T,V&gt;{ var functionPara:(()-&gt;T)? = null var recallFunctionWithFunction:( (Array&lt;out T&gt;) -&gt; V)? = null constructor(value: ()-&gt;T, recallFunctionWithFunction: (Array&lt;out T&gt;) -&gt; V ){ this.functionPara = value this.recallFunctionWithFunction = recallFunctionWithFunction } inline fun &lt;reified T, V&gt; compose(crossinline f: (Array&lt;out T&gt;) -&gt; V, vararg g: () -&gt; T): () -&gt; V { val results = g.map { it() } return { f(results.toTypedArray()) } } fun &lt;T, V&gt; compose(f: (List&lt;out T&gt;) -&gt; V, vararg g: () -&gt; T): () -&gt; V { val results = g.map { it() } return { f(results) } } } fun runCompose(){ compose(functionPara,recallFunctionWithFunction).invoke() }</pre><p> 但我發現,當我引用帶有 vararg 參數的 function 時</p><pre>fun functionA(vararg:Observable&lt;Any&gt;):LiveData&lt;Boolean&gt;{ } fun functionB():Observable&lt;Any&gt;{ }</pre><p> 當我執行類似::functionA 的操作時,A 的類型將是Array&lt;out Observable&lt;Any&gt;&gt;-&gt;LiveData&lt;Boolean&gt;因此,當我執行類似操作時</p><p>Test&lt;Observable&lt;Any&gt;,LiveData&lt;Boolean&gt;&gt;(::functionB,::functionA).runCompose()</p><p> <strong><em>情況 1</em></strong>如果我使用 compose function 並接受 List 類型,它將顯示類型不匹配,因為引用::functionA 將返回 Array</p><p><img src="https://i.stack.imgur.com/X3k3A.png" alt="圖片1"></p><p> <strong><em>情況 2</em></strong>如果我使用 compose function 並接受 Array 類型,它將顯示錯誤</p><p>不能使用“T”作為具體類型參數。 改用 class</p><p><img src="https://i.stack.imgur.com/Z2iwJ.png" alt="圖片2"></p><p> 在上一篇文章中,有人回答我將數組轉換為列表。 但是如何將引用 function 與 vararg 參數與原始Array&lt;out to List &lt;out ? 當我引用 function 之類的 function 時,類型必須是Array&lt;out但我想將其插入到 compose function 中。 我必須轉換它。 任何人都可以幫忙嗎? 我在那兒呆了很長時間。 希望有人能救我!!</p></div></out> ContentObservers沒用 如何在 Timber 的 vararg 中插入 arguments? 無法使用Java的vararg參數而不是vararg參數調用函數 有沒有辦法在vararg參數中保留類型?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM