สิ่งที่ฉันควรจะต้องกลับมาที่ kotlin ไหลเวียนก่อนฟังก์ชัน?

0

คำถาม

ฉันใช้ first ฟังก์ชันจาก kotlin ไหลเวียน. เหตุผลที่ทำไมฉันกำลังใช้นี่ first ฟังก์ชันคือฉันไม่ต้องเก็บหลังจากเป็นครั้งแรก ถ้าฉันไม่กลับมามีค่าทางตรรกะมันทำให้ขีดเส้นใต้สีแดงที่ฉันต้องกลับมาเป็นค่าทางตรรกะ. สิ่งที่ฉันควรจะกลับมา? ไม่มีปัญหาตอนที่ฉันเพิ่งกลับมาจริงแต่ฉันอยากรู้ว่ามันหมายถึงอะไร

    private fun getGroupNameData() {
        viewModelScope.launch {
            repository.loadGroupsWithFlow()
                .buffer()
                .first { newList ->
                    groupData.clear()
                    newList.forEach { newGroupData ->
                        groupData[newGroupData.id] = newGroupData.name
                    }
                    true // <- what is this boolean value?
                }
        }
    }

first รหัส

/**
 * The terminal operator that returns the first element emitted by the flow matching the given [predicate] and then cancels flow's collection.
 * Throws [NoSuchElementException] if the flow has not contained elements matching the [predicate].
 */
public suspend fun <T> Flow<T>.first(predicate: suspend (T) -> Boolean): T {
    var result: Any? = NULL
    collectWhile {
        if (predicate(it)) {
            result = it
            false
        } else {
            true
        }
    }
    if (result === NULL) throw NoSuchElementException("Expected at least one element matching the predicate $predicate")
    return result as T
}
1

คำตอบที่ดีที่สุด

2

นี่ของโอเวอร์โหลด Flow.first() คือเคยไปก่อนคุณค่าของการซึ่งตรงกับที่ให้ predicate. นั่นเป็นเหตุผลว่าทำไม lambda คาดหวังให้คุณกลับมาเป็นค่าตรรกะตอนที่ทุกอย่างจะจบลง สำหรับชุดไหนก็ได้ค่าค lambda จะได้ค่าเป็นจริงนั่นค่าจะถูกส่งกลับมาเรื่อยๆและมารวมกันของเลือจะถูกยกเลิกแล้ว

ถ้าเพียงแต่คุณต้องการคนแรกค่าคุณควรคนอื่นมากเกินไปซึ่งไม่ยอมรับเป็น predicate lambda.

val newList = repository.loadGroupsWithFlow().buffer().first() // Use this first()
groupData.clear()
newList.forEach { newGroupData ->
    groupData[newGroupData.id] = newGroupData.name
}

Btw ฉันไม่คิดว่าแถบชุดลวดลาย stencils จำเป็นต้องมีการใช้ คุณสามารถลบนั้น

2021-11-24 06:26:16

ขอบคุณคุณจะอธิบายว่าทำไมถึงชนก็ไม่ต้องการ?
Lee WonJoong

คุณสามารถดูมัน เอกสาร. ในคดีของคุณคุณเพียงสนใจเรื่องแรกค่า emitted โดยการไหลเวียดังนั้นคุณไม่จำเป็นต้องชนอะไรเลย
Arpit Shukla

โอ้ฉันเข้าใจ อย่างที่ฉันแค่ต้องการคนแรกค่าฉันไม่ต้องการที่บัฟเฟอร์. ขอบคุณ!
Lee WonJoong

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................