一、判空
集合判空
- 可以使用
Objects.isNull
和isEmpty
组合进行判空,也可以使用CollectionUtils.isEmpty
进行判空,等价于上边组合。
List<String> list = new ArrayList<>();
Objects.isNull(list);
list.isEmpty();
//上边两行等价于该行 (推荐使用)
CollectionUtils.isEmpty(list);
字符串判空
- pom 文件引入包
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
- java 文件导入包
import org.apache.commons.lang3.StringUtils;
- 代码演示
String s = "";
//判断是否为 null 和 size == 0 (带trim效果)推荐使用
StringUtils.isBlank(s);
//判断是否为 null 和 size == 0
StringUtils.isEmpty(s);
//多个判空,只要有一个为空,即返回FALSE
StringUtils.isAnyBlank("124","234");
其他判空
- Integer or Long
Integer integer = new Integer(2);
Objects.isNull(integer);
Long lo = null;
Objects.isNull(lo);
二、判断相等
String s1 = "";
String s2 = "";
//方法一
s1.equals(s2);
//方法二(推荐使用,避免空指针)
Objects.equals(s1,s2);
三、Optional 实例
1.of
为非 null 的值创建一个 Optional。of 方法通过工厂方法创建 Optional 类。需要注意的是,创建对象时传入的参数不能为 null。如果传入参数为 null,则抛出 NullPointerException 。
Optional<String> optional = Optional.of("xiaoming");
//传入null,抛出NullPointerException
Optional<Object> o = Optional.of(null);
2.ofNullable
为指定的值创建一个 Optional,如果指定的值为 null,则返回一个空的 Optional。
Optional<Object> o1 = Optional.ofNullable(null);
3.isPresent
值存在返回 true,否则返回 false
Optional<String> optiona2 = Optional.of("xiaoming");
System.out.println(optiona2.isPresent());
4.get
Optional 有值就返回,没有抛出 NoSuchElementException
Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.get());
5.ifPresent
如果 Optional 有值则调用 consumer 处理,否则不处理
Optional<Object> o1 = Optional.ofNullable(null);
o1.ifPresent(s -> System.out.println(s));
6.orElse
如果有值则将其返回,否则返回指定的其它值
Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElse("输出orElse")); // 输出orElse
7.orElseGet
orElseGet 与 orElse 方法类似,区别在于得到的默认值。orElse 方法将传入的字符串作为默认值,orElseGet 方法可以接受 Supplier 接口的实现用来生成默认值
Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElseGet(() -> "default value")); // default value
- 注意:orElse 和 orElseGet 看似差不多,其实有很大不同;看下面例子
Shop shop = null;
System.out.println("test orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//createNew
private static Shop createNew() { System.out.println("create new");
return new Shop("尺子", 50);
}//输出:
test orElsecreate newtest orElseGetcreate new
Shop shop = new Shop("钢笔",100);
System.out.println("test orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//输出
test orElsecreate newtest orElseGet
从上面两个例子可以看到,当 Optional 为空时,orElse 和 orElseGet 区别不大,但当 Optional 有值时,orElse 仍然会去调用方法创建对象,而 orElseGet 不会再调用方法;在我们处理的业务数据量大的时候,这两者的性能就有很大的差异。
8.orElseThrow
如果有值则将其返回,否则抛出 supplier 接口创建的异常。
Optional<Object> o1 = Optional.ofNullable(null);
try {
o1.orElseThrow(() -> new Exception("异常!"));
} catch (Exception e) {
System.out.println("info:" + e.getMessage());
}//输出:info:异常!
9.map
如果有值,则对其执行调用 mapping 函数得到返回值。如果返回值不为 null,则创建包含 mapping 返回值的 Optional 作为 map 方法返回值,否则返回空 Optional。
Optional<String> optional = Optional.of("xiaoming");
String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
System.out.println(s); //输出: XIAOMING
10.flatMap
如果有值,为其执行 mapping 函数返回 Optional 类型返回值,否则返回空 Optional。与 map 不同的是,flatMap 的返回值必须是 Optional,而 map 的返回值可以是任意的类型 T
Optional<String> optional = Optional.of("xiaoming");
Optional<String> s = optional.flatMap(e -> Optional.of(e.toUpperCase()));
System.out.println(s.get()); //输出:XIAOMING
11.filter
List<String> strings = Arrays.asList("rmb", "doller", "ou");
for (String s : strings) {
Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o"));
System.out.println(o.orElse("没有不包含o的"));
}//输出:
rmb
没有不包含o的
没有不包含o的
四、汇总
public static void main(String[] args) {
/** start:判空 2021/6/3 7:15 下午 */
//1. 集合
List<String> list = new ArrayList<>();
Objects.isNull(list);
list.isEmpty();
//上边两行等价于该行
CollectionUtils.isEmpty(list);
//2. 字符串
/*
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
*/
String s = "";
//判断是否为 null 和 size == 0 (带trim效果)推荐使用
StringUtils.isBlank(s);
//判断是否为 null 和 size == 0
StringUtils.isEmpty(s);
/** end:判空 2021/6/3 7:15 下午 */
/** start:相等 2021/6/3 7:16 下午 */
//是否相等
Objects.equals(s,s);
/** end:相等 2021/6/3 7:21 下午 */
/** start:Optional 实例 2021/6/3 7:21 下午 */
//1. of: 为非 null 的值创建一个 Optional。of 方法通过工厂方法创建 Optional 类。需要注意的是,创建对象时传入的参数不能为 null。如果传入参数为 null,则抛出 NullPointerException 。
Optional<String> optional = Optional.of("Hello");
//传入null,抛出NullPointerException
Optional<Object> o = Optional.of(null);
//2. ofNullable: 为指定的值创建一个 Optional,如果指定的值为 null,则返回一个空的 Optional。
Optional<Object> o1 = Optional.ofNullable(null);
//3. isPresent: 值存在返回 true,否则返回 false
Optional<String> o2 = Optional.of("Hello");
System.out.println(o2.isPresent());
//4. get Optional 有值就返回,没有抛出 NoSuchElementException
Optional<Object> o3 = Optional.ofNullable(null);
System.out.println(o3.get());
//5. ifPresent: 如果 Optional 有值则调用 consumer 处理,否则不处理
Optional<Object> o4 = Optional.ofNullable("Hello");
o4.ifPresent(ss -> System.out.println(ss));
//6.orElse: 如果有值则将其返回,否则返回指定的其它值
Optional<Object> o5 = Optional.ofNullable(null);
System.out.println(o1.orElse("输出orElse")); // 输出orElse
//7.orElseGet: orElseGet 与 orElse 方法类似,区别在于得到的默认值。orElse 方法将传入的字符串作为默认值,orElseGet 方法可以接受 Supplier 接口的实现用来生成默认值
/**
* 当 Optional 为空时,orElse 和 orElseGet 区别不大,但当 Optional 有值时,orElse 仍然会去调用方法创建对象,而 orElseGet 不会再调用方法;在我们处理的业务数据量大的时候,这两者的性能就有很大的差异。
*/
Optional<Object> o6 = Optional.ofNullable(null);
System.out.println(o1.orElseGet(() -> "default value")); // default value
//8.orElseThrow: 如果有值则将其返回,否则抛出 supplier 接口创建的异常。
Optional<Object> o7 = Optional.ofNullable(null);
try {
o1.orElseThrow(() -> new Exception("异常!"));
} catch (Exception e) {
System.out.println("info:" + e.getMessage());
}//输出:info:异常!
//9.map: 如果有值,则对其执行调用 mapping 函数得到返回值。如果返回值不为 null,则创建包含 mapping 返回值的 Optional 作为 map 方法返回值,否则返回空 Optional。
Optional<String> o8 = Optional.of("xiaoming");
String str = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
System.out.println(str); //输出: XIAOMING
//10.flatMap:如果有值,为其执行 mapping 函数返回 Optional 类型返回值,否则返回空 Optional。与 map 不同的是,flatMap 的返回值必须是 Optional,而 map 的返回值可以是任意的类型 T
Optional<String> o9 = Optional.of("xiaoming");
Optional<String> str1 = optional.flatMap(e -> Optional.of(e.toUpperCase()));
System.out.println(str1.get()); //输出:XIAOMING
//11.filter
List<String> strings = Arrays.asList("rmb", "doller", "ou");
for (String str2 : strings) {
Optional<String> o10 = Optional.of(str2).filter(s1 -> !s1.contains("o"));
System.out.println(o10.orElse("没有不包含o的"));
}
/** end: Optional 实例 2021/6/3 7:21 下午 */
}