Java 有没有更好的方法来确定ComputeFabSent是否返回新值?

Java 有没有更好的方法来确定ComputeFabSent是否返回新值?,java,concurrenthashmap,Java,Concurrenthashmap,我有这样的代码: ConcurrentMap<String, String> map = new ConcurrentHashMap<>(); AtomicBoolean isNew = new AtomicBoolean(false); String result = map.computeIfAbsent("foo", key -> { isNew.set(true); return "bar"; }); result = result + "c

我有这样的代码:

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.
}
ConcurrentMap=new ConcurrentHashMap();
AtomicBoolean isNew=新的AtomicBoolean(false);
字符串结果=map.computeIfAbsent(“foo”,键->{
isNew.set(true);
返回“bar”;
});
结果=结果+“在旧结果和新结果上发生的常见操作”;
if(isNew.get()){
//仅在新结果上发生的操作。必须在普通操作之后发生。
}
考虑到我的计算方法很重,我不想创建,如果不需要,会立即丢弃计算值,有没有更好的方法来实现这一点


编辑:我还担心我的代码如何处理线程。如果两个线程尝试为同一个键计算,我认为它们可能最终都会为isNew报告true。

您可以在
computeIfAbsent
lambda中使用逻辑-只有在必须计算新值时才会执行:

String result=map.computeIfAbsent(“foo”,键->{
//在这里做些特别的事情
返回“bar”;
});

感谢您的回复。在我的例子中,“特殊的东西”需要在结果发生的操作之后发生。我也可以将此操作包括在lamda中,但我需要一种方法使操作在lamda运行时不会发生。无论哪种方式,我最终都需要一个外部变量。如果JDK提供了一个接收lambda函数的
putIfAbsent
方法,这将非常有用。