Есть ли лучший способ определить, вернул ли computeIfAbsent новое значение? - PullRequest
1 голос
/ 04 апреля 2020

У меня есть такой код:

ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
AtomicBoolean isNew = new AtomicBoolean(false);
String result = map.computeIfAbsent("foo", key -> {
    isNew.set(true);
    return "bar";
});
result = result + "common op that occurs on both old and new results";
if (isNew.get()) {
    // op that occurs only on new results.  Must occur after common op.
}

Есть ли более красивый способ сделать это, учитывая, что мой метод вычислений достаточно тяжел, что я не хочу создавать, и сразу же отбрасываю вычисленные значения если они не нужны?

Редактировать: Меня также беспокоит, насколько хорошо мой код справится с многопоточностью. Если два потока пытаются вычислить для одного и того же ключа, я думаю, что оба они в конечном итоге сообщат об истине для isNew.

1 Ответ

2 голосов
/ 04 апреля 2020

Вы можете просто иметь логи c в лямбде computeIfAbsent - оно будет выполнено только в том случае, если необходимо вычислить новое значение:

String result = map.computeIfAbsent("foo", key -> {
    // do special stuff here
    return "bar";
});
...