void (T oldSelectedValue, int oldSelectedIndex) { ReadAction .nonBlocking(() -> { List<T> listItems = getListItems(); List<ListItemPresentation> presentations = ContainerUtil.map(listItems, this::getPresentation); return Pair.create(listItems, presentations); }) .finishOnUiThread(ModalityState.any(), items -> { try { updateList(oldSelectedValue, oldSelectedIndex, items.first, items.second); } finally { myList.setPaintBusy(false); } }) .coalesceBy(myUpdateCoalesceKey) .expireWith(this) .inSmartMode(myProject) .submit(AppExecutorUtil.getAppExecutorService()); }