java8引入新类Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException)
本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此
主要方法介绍:
构造方法:
private Optional();//返回一个含null的Optional实例
private Optional(T value);//返回一个非null的Optional实例,如果传入null,抛出空指针异常
普通方法 :
1. 静态方法 empyt(),返回一个空的Optional实例。
public static<T> Optional<T> empty();
2. 静态方法 of(T value),返回具有 Optional的当前非空值的Optional。如果value是null就抛出空指针异常
public static <T> Optional<T> of(T value);
3. 静态方法 ofNullable(T value),返回一个指定值的Optional实例,如果参数为null,则返回一个空的 Optional实例
public static <T> Optional<T> ofNullable(T value);
4. get(),如果 Optional中存在值,则返回值,否则抛出 NoSuchElementException
public T get();
5. isPresent(),如果存在值,则返回 true ,否则为 false
public boolean isPresent();
6. ifPresent(Consumer<? super T> consumer),如果存在值,则使用该值调用指定的消费者,否则不执行任何操作
public void ifPresent(Consumer<? super T> consumer){
if (value != null)
consumer.accept(value);
}
//eg:
opt.ifPresent( u -> assertEquals(user.getEmail(), u.getEmail()));
//这个例子中,只有 user 用户不为 null 的时候才会执行断言。
7. orElse(T other),返回值如果存在,否则返回 other(默认值)
public T orElse(T other);
8. orElseGet(Supplier<? extends T> other),返回值(如果存在),否则调用 other并返回该调用的结果。
public T orElseGet(Supplier<? extends T> other){
return value != null ? value : other.get();
}
9. orElseThrow(Supplier<? extends X> exceptionSupplier);返回包含的值(如果存在),否则抛出由提供的供应商创建的异常。
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
10. map(Function<? super T, ? extends U> mapper);//如果存在值,则应用提供的映射函数,如果结果不为空,则返回一个Optional结果的Optional 。 否则返回一个空的Optional 。
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
11. filter(Predicate<? super T> predicate);//如果一个值存在,并且该值给定的谓词相匹配时,返回一个 Optional描述的值,否则返回一个空的 Optional 。
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}
12. flatMap(Function<? super T, Optional<U>> mapper);//如果一个值存在,应用提供的Optional映射函数给它,返回该结果,否则返回一个空的Optional 。 这种方法类似于map(Function) ,但是提供的映射器是一个结果已经是Optional映射器,如果被调用, flatMap不会用额外的Optional 。
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
代码展示
public class OptionalTest {
public static void main(String[] args) {
//private static final Optional<?> EMPTY = new Optional<>();
//private final T value;
//private Optional() { this.value = null;}
//private Optional(T value) { this.value = Objects.requireNonNull(value);}
//1.public static<T> Optional<T> empty() 生成一个value为null的Optional
/*public static<T> Optional<T> empty() {
Optional<T> t = (Optional<T>) EMPTY;
return t;
}*/
Optional<String> empty = Optional.empty();
//2.public static <T > Optional < T > of(T value) 生成一个指定value的Optional
/*public static <T > Optional < T > of(T value) {
return new Optional<>(value);
}*/
Optional<String> optional = Optional.of("optional");
//3.public static <T> Optional<T> ofNullable(T value) 根据参数判断生成value是不是null的Oprional
/* public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}*/
Optional<String> optional1 = Optional.ofNullable("张三");
//4.public T get()//获取value值,如果是null抛出异常
/* public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}*/
//String s = empty.get();
String s1 = optional.get();
//5.isPresent() 判断value是不是为null
/*public boolean isPresent() {
return value != null;
}*/
boolean present = empty.isPresent();
boolean present1 = optional.isPresent();
//6.ifPresent(Consumer<? super T> consumer) 如果value不为null执行lambda
/*public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}*/
Optional<String> opt = Optional.of("123456");
opt.ifPresent(name -> System.out.println(name.length()));
//7.filter(Predicate<? super T> predicate) 用于过滤。接收一个函数式接口,当符合接口时,则返回一个Optional对象,否则返回一个空的Optional对象
/*public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}*/
Integer year = 2016;
Optional<Integer> yearOptional = Optional.of(year);
boolean is2016 = yearOptional.filter(y -> y == 2016).isPresent();
System.out.println(is2016);
boolean is2017 = yearOptional.filter(y -> y == 2017).isPresent();
System.out.println(is2017);
//8.map(Function<? super T, ? extends U> mapper) 将一个值转换成另一个值,下面的例子是返回字符串的长度,没有则返回默认值0
/*public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}*/
String name = "james";
Optional<String> nameOptional = Optional.of(name);
int len = nameOptional.map(String::length).orElse(0);
//9.public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)将一个值转换成另一个值,如果为null,抛出异常
/*public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}*/
String name2 = "bob";
Optional<String> name21 = Optional.of(name2);
name21.flatMap((n) -> null);
//10.public T orElse(T other) 如果optional不为null就返回value, 否则返回other
/*public T orElse(T other) {
return value != null ? value : other;
}*/
Person person2 = new Person();
person2.setName("Tom");
person2.setAge(18);
Optional<Person> userOptional = Optional.ofNullable(person2);
Person person3 = userOptional.orElse(new Person() {{
setAge(17);
setName("Jack");
}});
//11.public T orElseGet(Supplier<? extends T> other) 如果vaue不为null返回value,否则返回Supplier get()
/*public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}*/
Person person4 = new Person();
person4.setName("jack");
Optional<Object> empty1 = Optional.empty();
String name3 = String.valueOf(empty1.orElseGet(person4::getName));
//12.orElseThrow 返回Optional包裹的值,如果值为null,则抛出异常
/*public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}*/
Optional<String> str = Optional.empty();
try {
str.orElseThrow(Exception::new);
} catch (Exception e) {
e.printStackTrace();
}
//连环null检查
method1();
}
public static String method1() {
Person person = new Person("Tom");
Optional<Person> person2 = Optional.ofNullable(person);
person2.map(p -> p.getName()).map(p -> p.toLowerCase()).orElse(null);
if (person != null) {
String name4 = person.getName();
if (name4 != null) {
return name4.toLowerCase();
} else {
return null;
}
} else {
return null;
}
}
}