Optional
Optional实例的创建
//创建方式一(常用) - 使用ofNullable方法创建Optional对象时value可以为null。
Optional opt1 = Optional.ofNullable("武科");
Optional opt2 = Optional.ofNullable(null);
//创建方式二 - - 使用of 方法创建Optional 对象时value 不能为null,否则会抛空指针异常。
Optional opt3 = Optional.of("武科");
Optional opt4 = Optional.of(null);//报错:NullPointerException
//创建方式三:创建一个空的Optional对象
Optional opt5 = Optional.empty();
1.isPresent
值存在返回true,否则返回false
Optional<String> optiona2 = Optional.of("xiaoming");
System.out.println(optiona2.isPresent());
2.get
Optional有值就返回,没有抛出NoSuchElementException
Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.get());
3.ifPresent
如果Optional有值则调用consumer处理,否则不处理
Optional<Object> o1 = Optional.ofNullable(null);
o1.ifPresent(s -> System.out.println(s));
4.orElse orElseGet
orElse与orElseGet方法类似,区别在于前者立即计算,后者是延迟计算。所以如果备选值是无需计算的,现在已有的,那就用orElse。如果值还没得到,那最好用orElseGet延迟执行。一般最多的情况是类似字符串拼装、创建新对象或有与数据库交互或者远程调用的,都应该用orElseGet。
@Data
@AllArgsConstructor
@NoArgsConstructor
class Shop {
private String name;
private Integer price;
}
//====================案例一===================//
public static void main(String[] args) {
Shop shop = null;
System.out.println("测试orElse:");
Optional.ofNullable(shop).orElse(buy());
System.out.println("测试orElseGet:");
Optional.ofNullable(shop).orElseGet(TestController::buy);
}
private static Shop buy() {
System.out.println("购买方法执行了");
return new Shop("尺子", 50);
}
//输出:
测试orElse:
购买方法执行了
测试orElseGet:
购买方法执行了
//====================案例二===================//
public static void main(String[] args) {
Shop shop = new Shop("钢笔",100);
System.out.println("测试orElse:");
Shop shop1 = Optional.ofNullable(shop).orElse(buy());
System.out.println(shop1);
System.out.println("测试orElseGet:");
Shop shop2 = Optional.ofNullable(shop).orElseGet(TestController::buy);
System.out.println(shop2);
}
private static Shop buy() {
System.out.println("购买方法执行了");
return new Shop("尺子", 50);
}
//输出:
测试orElse:
购买方法执行了
Shop(name=钢笔, price=100)
测试orElseGet:
Shop(name=钢笔, price=100)
从上面两个例子可以看到,当Optional为空时,orElse和orElseGet区别不大,但当Optional有值时,orElse仍然会去调用方法创建对象,而orElseGet不会再调用方法;在我们处理的业务数据量大的时候,这两者的性能就有很大的差异。
5.orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
Optional<Object> o1 = Optional.ofNullable(null);
try {
o1.orElseThrow(() -> new Exception("异常!"));
} catch (Exception e) {
System.out.println("info:" + e.getMessage());
}//输出:info:异常!
6.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
7.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
8.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的