起因
在我工作过程中,一直会碰到这样一个问题,把程序运行过程中的数据,维护在内存中,方便下次查找。最近才发现自己的写法一直有问题。
之前的写法
public static void main(String[] args) {
List<String> names = Stream.of("aaa","bbb","ccc","bbb").collect(Collectors.toList());
Map<String, Integer> result = new HashMap<>(8);
for (String name : names) {
if(result.containsKey(name)){
result.put(name, result.get(name) + 1);
}else{
result.put(name, 1);
}
}
System.out.println(result);
}
上面这种写法,在对于简单数据处理上还能接受,但是对于复杂数据,比如3层结构,写起来就比较混乱了。
public static void main(String[] args) {
List<String> lunch1 = Stream.of("cjq","2010710","咖喱").collect(Collectors.toList());
List<String> lunch2 = Stream.of("cjq","2010711","牛肉").collect(Collectors.toList());
List<String> lunch3 = Stream.of("cbx","2010710","咖喱").collect(Collectors.toList());
List<String> lunch4 = Stream.of("cbx","2010710","鸡肉").collect(Collectors.toList());
List<List<String>> all = new LinkedList<>();
all.add(lunch1);
all.add(lunch2);
all.add(lunch3);
all.add(lunch4);
Map<String, Map<String, String>> result = new HashMap<>(8);
for (List<String> lunch : all) {
if(result.containsKey(lunch.get(0))){
Map<String, String> day = result.get(lunch.get(0));
if(day.containsKey(lunch.get(1))){
day.put(lunch.get(1), day.get(lunch.get(1)) + "," + lunch.get(2));
}else {
day.put(lunch.get(1), lunch.get(2));
}
}else{
Map<String, String> day = new HashMap<>(8);
day.put(lunch.get(1), lunch.get(2));
result.put(lunch.get(0), day);
}
}
System.out.println(result);
}
代码改进
public static void main(String[] args) {
List<String> names = Stream.of("aaa","bbb","ccc","bbb").collect(Collectors.toList());
Map<String, Integer> result = new HashMap<>(8);
for (String name : names) {
result.put(name, result.getOrDefault(name, 0) + 1);
}
System.out.println(result);
}
public static void main(String[] args) {
List<String> lunch1 = Stream.of("cjq", "2010710", "咖喱").collect(Collectors.toList());
List<String> lunch2 = Stream.of("cjq", "2010711", "牛肉").collect(Collectors.toList());
List<String> lunch3 = Stream.of("cbx", "2010710", "咖喱").collect(Collectors.toList());
List<String> lunch4 = Stream.of("cbx", "2010710", "鸡肉").collect(Collectors.toList());
List<List<String>> all = new LinkedList<>();
all.add(lunch1);
all.add(lunch2);
all.add(lunch3);
all.add(lunch4);
Map<String, Map<String, String>> result = new HashMap<>(8);
for (List<String> lunch : all) {
Map<String, String> day = result.getOrDefault(lunch.get(0), new HashMap<>());
String food = day.getOrDefault(lunch.get(1), null);
if (food != null) {
day.put(lunch.get(1), food + "," + lunch.get(2));
}else{
day.put(lunch.get(1), lunch.get(2));
}
result.put(lunch.get(0), day);
}
System.out.println(result);
}
使用到了map提供的接口getOrDefault。
源码解析
588行:判断了这个key是否为空,如果没有就返回我们传入的默认值,简化了代码逻辑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。