java8 容器类Optional学习笔记
文章目录
java8引入入了·一个1容器类Optional,解决了空指针异常不容易查找的痛点问题。java8 DOC中介绍:
这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Option提供的方法
of
为非null的值创建一个Optional。
of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。
Optional<Student> s = Optional.of(new Student(222, "华仔", 8888));
System.out.println(s.get());//student{age=222, name='华仔', many=8888}
Optional<Student> s = Optional.of(null);
抛出异常:java.lang.NullPointerException
ofNullable
为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
isPresent
如果值存在返回true,否则返回false。
Optional s = Optional.ofNullable(null);
System.out.println(s.isPresent());//false
get
如果Optional有值则将其返回,否则抛出NoSuchElementException。
Optional<Student> s = Optional.of(new Student(222, "华仔", 8888));
System.out.println(s.get());//student{age=222, name='华仔', many=8888}
ifPresent
如果Optional实例有值则为其调用consumer,否则不做处理。注意:这里调用的是Consumer消费型接口,有参数,无返回值。
Optional<Student> s = Optional.of(new Student(36, "AA", 9000));
s.ifPresent((e)->{
e.setName("AA+BB+CC");
System.out.println(e);//student{age=36, name='AA+BB+CC', many=9000}
});
orElse
如果有值则将其返回,否则返回指定的其它值。
Optional<Student> s = Optional.of(new Student(36, "AA", 9000));
System.out.println(s.orElse(new Student(100, "其他", 9000)));//student{age=36, name='AA', many=9000}
Optional<Student> s = Optional.ofNullable(null);//如果使用of会报出空指针异常
System.out.println(s.orElse(new Student(100, "其他", 9000)));//student{age=36, name='其他', many=9000}
orElseGet
orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。无参有返回值
Optional<Student> s = Optional.ofNullable(null);
System.out.println(s.orElseGet(()->new Student(36, "其他", 9000)));//student{age=36, name='其他', many=9000}
orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。
try{
Optional<Student> s = Optional.ofNullable(null);
s.orElseThrow(IllegalArgumentException::new);
}catch (Throwable e){
System.out.println("error:"+e.getMessage());
}
map
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。
String name="asdfg";
Optional<String> n = Optional.of(name);
Optional<String> s = n.map(e -> e.toUpperCase());
if(s.isPresent()){
String s1 = s.get();
System.out.println(s1);
}
flatMap
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。
flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。
参照map函数,使用flatMap重写的示例如下:
String name="asdfg";
Optional<String> n = Optional.of(name);
Optional<String> s = n.flatMap(e -> Optional.of(e.toUpperCase()));
if(s.isPresent()){
String s1 = s.get();
System.out.println(s1);
}
filter
如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
这里可以传入一个lambda表达式。对于filter函数我们应该传入实现了Predicate接口的lambda表达式。
String name="asdfg";
Optional<String> n = Optional.of(name);
Optional<String> s = n.filter(e -> e.length()<8);
if(s.isPresent()){
String s1 = s.get();
System.out.println(s1);
}