java.util.NoSuchElementException:列表不包含与谓词匹配的元素

a_s*_*ber 2 android kotlin

安卓工作室 3.6

 val reversedEventList: List<Event> = (response.body() as List<Event>).reversed()
                Debug.d(TAG, "loadEvents: reversedEventList(" + reversedEventList.size + ")")
                val lastEvent: Event = reversedEventList.last {
                    it.info?.deviceId.equals(
                        DeviceUtil.deviceId,
                        true
                    ) && it.type == Type.CALL_WAITRESS
                }
Debug.d(TAG, "loadEvents: lastEvent = $lastEvent)")
Run Code Online (Sandbox Code Playgroud)

在这里logcat:

MainViewModel( 5086): loadEvents: reversedEventList(338)
MainViewModel( 5086): loadEvents: lastEvent = Event{id = 366, orgn = 17, type = CALL_WAITRESS, started = 1566750174, finished = 1566750194, closeUser = 1, info = Info{isCash=false, isDiscount=false, deviceId = 41c2d0af61254f94a948882c7613d873}, user = '0', room = 1, table = 66, place = 1, closeInfo = CloseInfo{expectedResponceMinutes=0}})
Run Code Online (Sandbox Code Playgroud)

好的。

在下一个测试用例中,我强制设置空列表

val reversedEventList: List<Event> = ArrayList<Event>()
Run Code Online (Sandbox Code Playgroud)

现在我得到错误:

MainViewModel( 7932): loadEvents: reversedEventList(0)
11-12 15:01:44.789 E/AndroidRuntime( 7932): FATAL EXCEPTION: main
11-12 15:01:44.789 E/AndroidRuntime( 7932): Process: debug, PID: 7932
11-12 15:01:44.789 E/AndroidRuntime( 7932): java.util.NoSuchElementException: List contains no element matching the predicate.
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at MainViewModel$loadEvents$1.invokeSuspend(MainViewModel.kt:180)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at android.os.Handler.handleCallback(Handler.java:739)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at android.os.Handler.dispatchMessage(Handler.java:95)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at android.os.Looper.loop(Looper.java:148)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at java.lang.reflect.Method.invoke(Native Method)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-12 15:01:44.789 E/AndroidRuntime( 7932):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)

And*_*sen 6

也许使用lastOrNull将是您的一个选择:

val eventList: List<String> = emptyList()
val lastEvent: String? = eventList.reversed().lastOrNull { "test" == it }
Run Code Online (Sandbox Code Playgroud)