У меня есть HashMap:
private final ConcurrentHashMap<String, List<Client>> clients;
И класс:
public static class Client {
private String name; // it is also the key of the map
private String url;
}
Из нескольких потоков я вызываю потокобезопасный метод " removeElement ", который долженудалить одно значение из списка.
@Override
public CompletableFuture<Void> removeClient(Client client) {
return CompletableFuture.runAsync(() ->
clients.entrySet().removeIf(v ->
v.getValue().removeIf(
it -> client.url.equals(it.url))
)
);
}
Но, конечно, это не работает. Когда я получил метод сгенерировал исключение java.lang.UnsupportedOperationException, я решил проблему следующим образом:
@Override
public CompletableFuture<Void> removeClient(Client client) {
return CompletableFuture.runAsync(() -> {
List<Client> currentClients = new ArrayList<>(clients.get(client.getName()));
currentClients.remove(client);
if (currentClients.isEmpty()) {
clients.remove(client.getName());
} else {
clients.put(client.getName(), currentClients);
}
}
);
}
Но он не является поточно-ориентированным. Как я могу достичь этого здесь? Может быть, есть более элегантные способы ее решения?