computeIfAbsent 使用
源码解析
两
个
参
数
K
k
e
y
,
F
u
n
c
t
i
o
n
<
?
s
u
p
e
r
K
,
?
e
x
t
e
n
d
s
V
>
m
a
p
p
i
n
g
F
u
n
c
t
i
o
n
也
就
是
:
首
先
使
用
m
a
p
.
g
e
t
(
k
e
y
)
,
如
果
存
在
则
返
回
。
\color{red}两个参数 K key, Function<? super K, ? extends V> mappingFunction 也就是:首先使用map.get(key),如果存在则返回。
两个参数Kkey,Function<?superK,?extendsV>mappingFunction也就是:首先使用map.get(key),如果存在则返回。
如
果
不
存
在
,
则
调
用
第
二
个
函
数
,
产
生
一
个
对
象
返
回
\color{red}如果不存在,则调用第二个函数,产生一个对象返回
如果不存在,则调用第二个函数,产生一个对象返回
注
意
这
里
还
会
将
对
象
塞
入
到
m
a
p
中
\color{red}注意这里还会将对象塞入到map中
注意这里还会将对象塞入到map中
类似代码:
@Test
public void test1() {
Map<String, String> map = Maps.newHashMapWithExpectedSize(16);
String a = map.get("a");
if (StringUtils.isBlank(a)) {
a = "a没有值,手动赋值";
}
String b = map.computeIfAbsent("b", x -> "b也是没有值,手动出去一个");
System.out.println(a);
System.out.println(b);
}
复杂用法
/**
* 根据pspuId获取未来时间的最小最大购买件数map
* @param prodSpuIdSet pSpuIdSet
* @param previewPriceTimes 预告价取价时间对应获取未来的最小最大购买件数
* @return key是ProdSpuI; value: key 时间格式为 yyyy-MM-dd HH:mm:ss 的未来时间, value 最小最大购买件数vo
*/
private Map<String, Map<Long, ProdSpuCurrentMinMax>> getPreviewProdSpuCurrentMinMaxMap(Set<String> prodSpuIdSet,
List<Date> previewPriceTimes) {
Map<String, Map<Long, ProdSpuCurrentMinMax>> previewMinMaxMap = Maps
.newHashMapWithExpectedSize(prodSpuIdSet.size());
if (CollectionUtil.isNotEmpty(prodSpuIdSet)) {
previewPriceTimes.forEach(previewPriceTime -> {
Map<String, ProdSpuCurrentMinMax> minMax = XXXXXXX.INSTANCE
.getProdSpuCurrentMinMax(Lists.newArrayList(prodSpuIdSet), previewPriceTime.getTime());
minMax.forEach((k, v) -> previewMinMaxMap.computeIfAbsent(k, a -> Maps.newHashMapWithExpectedSize(3))
.put(previewPriceTime.getTime(), v));
});
}
log.info(LogMsgKit.of("getPreviewProdSpuCurrentMinMaxMap").p("previewMinMaxMap", previewMinMaxMap)
.end("获取预告价取价时间的起购件数!"));
return previewMinMaxMap;
}