Java新特性之Optional
Optional类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。
of
为非null的值创建一个Optional,如果值为null,则会抛出NullPointerException
public static void main(String[] args) {
User user = null;
Optional<User> user1 = Optional.of(user);
System.out.println(user1);
}
ofNullable
为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
public static void main(String[] args) {
User user = null;
Optional<User> user1 = Optional.ofNullable(user);
System.out.println(user1);
user = new User();
Optional<User> user2 = Optional.ofNullable(user);
System.out.println(user2);
}
isPresent
如果值存在返回true,否则返回false。
public static void main(String[] args) {
User user = null;
Optional<User> user1 = Optional.ofNullable(user);
System.out.println(user1);
System.out.println(user1.isPresent());
user = new User();
Optional<User> user2 = Optional.ofNullable(user);
System.out.println(user2);
System.out.println(user2.isPresent());
}
get
如果Optional有值则将其返回,否则抛出NoSuchElementException。
public static void main(String[] args) {
User user = null;
Optional<User> user1 = Optional.ofNullable(user);
System.out.println(user1);
System.out.println(user1.isPresent());
System.out.println(user1.get());
}
ifPresent
如果Optional实例有值则为其调用consumer,否则不做处理 。隐士地其中进行了null判断。
public static void main(String[] args) {
User u1 = null;
User u2 = new User();
u2.setName("光阳");
Optional<User> optionalUser1 = Optional.ofNullable(u1);
Optional<User> optionalUser2 = Optional.ofNullable(u2);
optionalUser1.ifPresent(u -> System.out.println("optionalUser1=" + u.getName()));
optionalUser2.ifPresent(u -> System.out.println("optionalUser2=" + u.getName()));
}
orElse
如果有值则将其返回,否则返回指定的其它值。
public static void main(String[] args) {
String str1 = null;
String str2 = "我是谁";
Optional<String> optionalStr1 = Optional.ofNullable(str1);
Optional<String> optionalStr2 = Optional.ofNullable(str2);
System.out.println("optionalUser1 = " + optionalStr1.orElse("默认字符串"));
System.out.println("optionalUser2 = " + optionalStr2.orElse("默认字符串"));
}
8. orElseGet
orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的一个值作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
public static void main(String[] args) {
Integer i = 20;
Optional<Integer> op = Optional.ofNullable(i);
System.out.println(op.orElseGet(()->0));
System.out.println(Optional.ofNullable(null).orElseGet(()->0));
}
9. orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
public static void main(String[] args) {
// 自己指定异常
System.out.println((Optional.ofNullable("a").orElseThrow(()->new IndexOutOfBoundsException())));
System.out.println((Optional.ofNullable(null).orElseThrow(()->new IndexOutOfBoundsException())));
}
10. map
map处理有值的情况,如果有值,则对其执行调用map参数中的函数得到返回值,否则返回空Optional。
public static void main(String[] args) {
List<String> list = new ArrayList<String>(){
{
add("aaa");
add("bbb");
add(null);
}
};
list.stream().forEach(temp ->{
Optional<String> opt = Optional.ofNullable(temp);
System.out.println(opt.map(n -> {
return n.toUpperCase();
}).orElse("Nothing"));
});
// 简写为如下形式
list.stream().forEach(temp->{
System.out.println(Optional.ofNullable(temp).map(n->n.toUpperCase()).orElse("Nothing"));
});
}
11. flatMap
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。 可以将内容
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable("aaa");
Optional<String> opt2 = Optional.ofNullable(null);
System.out.println(opt1.flatMap(n->{
return Optional.ofNullable(n.toUpperCase());
}).orElse("还会没有吗"));
System.out.println( opt2.flatMap(n->{
return Optional.ofNullable(n.toUpperCase());
}).orElse("还会没有吗"));
}
12. filter
如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable("aabbbbaa");
Optional<String> opt2 = Optional.ofNullable(null);
System.out.println(opt1.filter(value->value.length()>6));
System.out.println(opt2.filter(value->value.length()>6));
}