目次
1.Java でmapの値(value)を弄る時によくやるコードの書き方
2.注意点
Java でmapの値(value)を弄る時によくやるコードの書き方
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
// ~中略~
// DBからデータを取得する
List<int> targetIdList = new ArrayList(Arrays.asList(1, 2, 5));
SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
String strStareDate = "2023/09/03 00:00:00";
String strEndDate = "2023/09/04 00:00:00";
Date startDate = sdFormat.parse(strStareDate);
Date endDate = sdFormat.parse(strEndDate);
List<Entity> entityList = nwe dao().findById(targetIdList,startDate, endDate);
// key:ID value:IDに対応するデータ
Map<String, List<entity>> dbDataMap = new LinkedHashMap<>();
for (Entity entity : entityList) {
List<Entity> mapEntityList =
dbDataMap.get(entity.getId());// ★ここ★
if (Objects.isNull(mapEntityList) { // keyに対応するものがMapに登録されていない場合
mapEntityList = new ArrayList<>();
dbDataMap.put(entity.getId(), mapEntityList);
}
mapEntityList.add(entity):
}
〇Map
kye | value |
---|---|
Id① | [[Entity], [Entity]] |
Id② | [[Entity]] |
上記のコードの★ここ★で、Mapから取り出したものがMapに登録されていない(NULLの)場合、
kye | value(これ!!) |
---|
Mapから取り出したvalueを格納した
mapEntityListがNULLになる。
Mapから取り出したvalueかを変数に格納したモノと、Mapのvalue(Mapのvalue = オブジェクト)は、同じになる。
つまり、Mapから取り出したvaluを格納してあるListに対してaddや+(加算)、-(減算)とかの処理を加えると、Mapの中のValueの値も連動して変わる!!
そのため、わざわざMapから取り出したvalude(オブジェクト)をMapに入れ直したりする必要は無く、この数行で処理が終わる。
(私はいつもこれをやろうとしていつもハマってる。。。)
注意点
事象
Mapから取り出したvalu(オブジェクト)に対して変更を加えているハズなのに変更されていない!!
// DBからデータを取得する
List<int> targetIdList = new ArrayList(Arrays.asList(1, 2, 5));
SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
String strStareDate = "2023/09/03 00:00:00";
String strEndDate = "2023/09/04 00:00:00";
Date startDate = sdFormat.parse(strStareDate);
Date endDate = sdFormat.parse(strEndDate);
List<Entity> entityList = nwe dao().findById(targetIdList,startDate, endDate);
// key:ID value:IDに対応するデータ
Map<String, Integer> countMap = new LinkedHashMap<>();
for (Entity entity : entityList) {
Integer count =
countMap.get(entity.getId());
if (Objects.isNull(count) { // keyに対応するものがMapに登録されていない場合
count = 0;
countMap.put(entity.getId(), count);
}
count = Integer.sum(count, 1): // ★countに1を加算★
}
count = Integer.sum(count, 1): // ★countに1を加算★
で countに1を足した値を代入しているハズなのに、加算がされていない!!
理由:
Integer.sum()は関数(メソッド)であるため、戻り値で返されるモノは、countに格納したオブジェクトとは別なオブジェクトである。
Integer.sum()の仕様↓
そのため、countに格納したオブジェクトには変更がされず、値が変わらなかった。
対策
count = Integer.sum(count, 1): // ★countに1を加算★
を
count += 1: // ★countに1を加算★
にする!!