Optional真么好用,真的可以完全替代if判断吗?
答案是否定的
举一个最简单的栗子:
例子1:
如果我只想判断对象的某一个变量是否为空并且做出判断呢?
Person person=new Person();
person.setName("");
persion.setAge(2);
//普通判断
if(StringUtils.isNotBlank(person.getName())){
//名称不为空执行代码块
}
//使用Optional做判断
Optional.ofNullable(person).map(p -> p.getName()).orElse("name为空");
只是一个很简单判断,如果用了Optional我们还需要考虑包装值,考虑代码书写,考虑方法调用,虽然只有一行,但是可读性并不好,如果别的程序员去读,我觉得肯定没有if看的明显
Optional的使用:
public class Test {
public static void main(String[] args) {
Person person=new Person();
person.setAge(2);
person.setName("名字");
// 获取包装前的对象
Object obj = Optional.ofNullable(person).get();
// 判断是否为空,不为空打印年龄
Optional.ofNullable(person).ifPresent(p -> System.out.println("年龄:" + p.getAge()));
// 这是person的包装对象,或者是Optional<?> EMPTY
Optional<Person> optionalPerson = Optional.ofNullable(person).filter(item -> item.getAge() < 50);
// 获取person的name属性
String name = Optional.ofNullable(person).map(p -> person.getName()).orElse("name为空");
System.out.println(name);
// 获取name属性的Optional包装对象
Optional<Object> optName = Optional.ofNullable(person).map(p -> Optional.ofNullable(p.getName()).orElse("name为空"));
System.out.println(optName);
// Supplier也是创建对象的一种方式,简单来说,Suppiler是一个接口,是类似Spring的懒加载,声明之后并不会占用内存,只有执行了get()方法之后,
// 才会调用构造方法创建出对象创建对象的语法的话就是Supplier supPerson= Person::new;需要使用时supPerson.get()即可
Optional<Supplier<Person>> sup = Optional.ofNullable(Person::new);
Optional.ofNullable(person).orElseGet(sup.get());
// 对象为空抛异常
Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("没有查询的相关数据"));
}
}
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}