kotlin forEach的陷阱

秒速五厘米 2022-05-28 09:42 197阅读 0赞

出错版本:不能这样用 ,forEach时不能操作元素

  1. t?.itemList?.forEach { it ->
  2. if (it.type == "textCard" || it.type == "briefCard") {
  3. t.itemList?.remove(it)
  4. }
  5. }

错误:

  1. 03-18 09:31:37.179 25812-25812/com.xfhy.life E/AndroidRuntime: FATAL EXCEPTION: main
  2. Process: com.xfhy.life, PID: 25812
  3. java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.
  4. at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111)
  5. at android.os.Handler.handleCallback(Handler.java:739)
  6. at android.os.Handler.dispatchMessage(Handler.java:95)
  7. at android.os.Looper.loop(Looper.java:135)
  8. at android.app.ActivityThread.main(ActivityThread.java:5418)
  9. at java.lang.reflect.Method.invoke(Native Method)
  10. at java.lang.reflect.Method.invoke(Method.java:372)
  11. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
  12. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
  13. Caused by: java.util.ConcurrentModificationException
  14. at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
  15. at com.xfhy.video.presenter.impl.VideoSearchPresenter$searchVideoByKey$1.onNext(VideoSearchPresenter.kt:48)
  16. at com.xfhy.video.presenter.impl.VideoSearchPresenter$searchVideoByKey$1.onNext(VideoSearchPresenter.kt:34)
  17. at io.reactivex.internal.operators.flowable.FlowableObserveOn$ObserveOnSubscriber.runAsync(FlowableObserveOn.java:400)
  18. at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
  19. at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
  20. at android.os.Handler.handleCallback(Handler.java:739)
  21. at android.os.Handler.dispatchMessage(Handler.java:95)
  22. at android.os.Looper.loop(Looper.java:135)
  23. at android.app.ActivityThread.main(ActivityThread.java:5418)
  24. at java.lang.reflect.Method.invoke(Native Method)
  25. at java.lang.reflect.Method.invoke(Method.java:372)
  26. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
  27. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

正确写法:这样用是可以的,因为内部其实是for循环(while循环 从后往前)

  1. t?.itemList?.forEachReversedByIndex { it ->
  2. if (it.type == "textCard" || it.type == "briefCard") {
  3. t.itemList?.remove(it)
  4. }
  5. }

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mybatisforeach标签

        JDBC有批处理,mybatis中的foreach标签也支持批处理,功能非常强大,在动态sql中是很重要的一员,今天就给大家来讲一下foreach标签。     <f