Java推荐操作
判空
不推荐用法
不推荐的原因是,不够语义化。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Test
public void npeMap() {
HashMap<String, HashMap<String, String>> map = new HashMap<>(2);
HashMap<String, String> hashMap = new HashMap<>(1);
hashMap.put("country", "china");
map.put("shali", hashMap);
if (null != map.get("shali")) {
HashMap<String, String> shali = map.get("shali");
if (null != shali.get("country")) {
Assertions.assertEquals("china", shali.get("country"));
}
}
}
|
推荐用法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Test
public void npeMap() {
HashMap<String, HashMap<String, String>> map = new HashMap<>(2);
HashMap<String, String> hashMap = new HashMap<>(1);
hashMap.put("country", "china");
map.put("shali", hashMap);
if (Objects.nonNull(map.get("shali"))) {
HashMap<String, String> shali = map.get("shali");
if (Objects.nonNull(shali.get("country"))) {
Assertions.assertEquals("china", shali.get("country"));
}
}
}
|
链式调用空指针检查Optional
错误用法
链式调用,存在 NullPointerException
的危险。
1
2
3
4
5
6
7
8
9
10
|
@Test(expected = NullPointerException.class)
public void npeMap() {
HashMap<String, HashMap<String, String>> map = new HashMap<>(2);
HashMap<String, String> hashMap = new HashMap<>(1);
hashMap.put("country", "china");
map.put("shali", hashMap);
Assertions.assertEquals("china", map.get("shali").get("country"));
// 注解断言抛出空指针异常 NullPointerException
Assertions.assertEquals("china", map.get("tony").get("country"));
}
|
正确用法
1
2
3
4
5
6
7
8
9
10
|
@Test
public void npeMap() {
HashMap<String, HashMap<String, String>> map = new HashMap<>(2);
HashMap<String, String> hashMap = new HashMap<>(1);
hashMap.put("country", "china");
map.put("shali", hashMap);
Assertions.assertEquals("china", Optional.ofNullable(map).map(mapper -> mapper.get("shali")).map(mapper -> mapper.get("country")).orElse(null));
// 此处不会抛 NullPointerException
Assertions.assertNull(Optional.ofNullable(map).map(mapper -> mapper.get("tony")).map(mapper -> mapper.get("country")).orElse(null));
}
|
其他语言的链式判空操作
PHP8.0
PHP 8.0 引入了1个新特性,指针安全运算符。
1
|
string name = shali()?->info()?->name();
|
?->
就是指针安全运算符 null safe
。
Kotlin
kotlin 定义了 2 个语法糖,?.
不为 null 时的处理,?:
为 null 时的处理。
?:
这个 PHP 使用者很熟悉,就是为空时的处理语法糖。
1
2
3
4
5
6
7
|
// 不为 null 时的操作
val files = File("Test").listFiles()
println(files?.size)
// 不为 null 时的操作和为 null 时的操作
val files = File("Test").listFiles()
println(files?.size ?: "empty")
|
Swift
跟 kotlin 很像,但是他还支持数组的元素的判断。
返回值为集合的方法正确返回方式
返回值List
1
2
3
4
5
|
public List<String> getNumbers() {
// 不建议
// return new ArrayList<>();
return Collections.emptyList();
}
|
返回Map
1
2
3
4
5
|
public Map<Object, Object> getNumbers() {
// 不建议
// return new HashMap<>();
return Collections.emptyMap();
}
|
返回Set
1
2
3
4
5
|
public Set<String> getNumbers() {
// 不建议
// return new HashSet<>();
return Collections.emptySet();
}
|
返回空集合
方法返回值定义返回集合的,如果没有结果,推荐返回空集合,而不是 NULL。
即使返回空集合也有讲究,因为不推荐 new 一个空集合返回。而是使用内置的集合工具方法。
1
2
3
4
5
6
7
8
9
10
|
// 返回空 Set
java.util.Collections#emptySet
java.util.Collections#emptyList
java.util.Collections#emptyMap
java.util.Collections#emptySortedMap
java.util.Collections#emptyNavigableMap
|