1. 定义方法
1.1 empty
返回一个空的Optaional
实例,在这个实例中没有值存在。
public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; }
1.2 of
返回一个值不能为空的Optional
实例,在这个实例中值为null
时抛出NPE。
public static <T> Optional<T> of(T value) { return new Optional<>(value); } private Optional(T value) { this.value = Objects.requireNonNull(value); }
1.3 ofNullable
返回一个值可以为空的Optional
实例,在这个实例中值为null
时返回一个空的Optaional
实例。
public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }
2. 功能方法
2.1 isPresent
如果有值存在,返回true
,否则返回false
。
People people = new People(); System.out.println(Optional.ofNullable(people).isPresent()); // print: true people = null; System.out.println(Optional.ofNullable(people).isPresent()); // print: false
2.2 get()
如果有值存在,返回值,否则抛出NoSuchElementException
。
People people = new People(); System.out.println(Optional.ofNullable(people).get()); // print: People@61bbe9ba people = null; System.out.println(Optional.ofNullable(people).get()); // print: Exception in thread "main" java.util.NoSuchElementException: No value present
2.3 orElse
如果有值存在,返回值,否则返回该 orElse
方法参的数,可以用来定义默认值。
String str = null; String result = Optional.ofNullable(str).orElse("default"); // print: default System.out.println(result); 2.4 orElseGet
2.4 orElseGet
如果有值存在,返回值,否则返回提供者函数,可以用函数返回值来定义默认值。
String str = null; String result = Optional.ofNullable(str).orElseGet(() -> "ajn"); // print: ajn System.out.println(result);
2.5 orElseThrow
如果有值存在,返回值,否则返回函数接口参数提供的异常。
String str = null; String result = Optional.ofNullable(str).orElseThrow(IllegalArgumentException::new); // print: Exception in thread "main" java.lang.IllegalArgumentException System.out.println(result);
2.6 ifPresent
如果有值存在,方法参数提供的函数接口会进行处理,否则不做任何操作。
Optional.ofNullable(getPeople()).ifPresent(people -> { System.out.println("the people is nut null: " + people); });
上面代码等价于:
People people = getPeople(); if (people != null){ System.out.println("the people is nut null: " + people); }
2.7 filter
如果有值存在,并且值符合给定的函数条件,返回当前Optional
,否则返回一个空的Optaional
实例,可以用来过滤特殊值。
String name = "AiJiangnan"; // 给定的条件是字符串包含Ai String result = Optional.of(name).filter(str -> str.contains("Ai")).orElse("字符串不包含Ai"); System.out.println(result);
2.8 map
如果有值存在,可以将该值的类型转换成其他类型,并返回转换后类型的Optional
实例,否则返回一个空的Optaional
实例,可以链式判空,非常实用。
People people = null; String result = Optional.ofNullable(people) .map(People::getName) .map(String::toUpperCase) .orElse("default"); System.out.println(result);
只有当people
对象不为null
,并且people.getName()
不为null
,才返回name全部转换为大写的字符串,否则都返回 default。
2.9 flatMap
如果有值存在,可以将该值的类型转换成其他类型,但最终只能转成 Optional
实例,否则返回一个空的Optaional
实例。该方法与map
方法类似,只是该方法返回的Optional
实例由函数参数返回。
People people = new People(); people.setName(" ajn "); String result = Optional.ofNullable(people) .flatMap(peo -> Optional.ofNullable(peo.getName())) .flatMap(str -> Optional.of(str.toUpperCase())) .orElse("default"); System.out.println(result);