JDK1.8之 Optional
程序员文章站
2022-03-03 23:07:37
...
前言:Java开发工作中:调用一个方法返回值可能为空,需要进行Null判断,然后做一些相应的业务或者直接抛出NullPointerException。为了减少这样的null值判断,java官方借鉴google guava 类库的 Optional类,在java8中引入了字节的Optional类
of 方法
- 为非Null值创建一个Optional
- of 方法通过工厂方法创建Optional 实例,需要注意传入的参数不能为null.否则抛出NullPointerException异常
@Test
public void testOptionalOf () {
Optional<User> user = Optional.of(new User());
System.out.println(user);
// --- NullPointerException
Optional<User> users = Optional.of(null);
System.out.println(users);
}
ofNullable
- 为指定的值创建一个Optional, 如果指定的值为null, 则返回一个空的Optional。可为空的Optional。
@Test
public void testOptionalOfNullable () {
Optional o = Optional.ofNullable(null);
System.out.println(o);
}
isPresent
- 如果值存在返回true, 否则返回false
/**
* 如果值存在返回true, 否则返回false
*/
@Test
public void testOptionalIsPresent () {
// 存在该值
Optional<User> username = Optional.ofNullable(new User());
if(username.isPresent()){
System.out.println(username.get());
}
// 不存在
Optional<User> user = Optional.ofNullable(null);
if(user.isPresent()){
System.out.println(user.get());
}
}
get
- 如果Optional 有值则将其返回, 否则抛出NoSuchElementException
/**
* 如果Optional 有值则将其返回, 否则抛出NoSuchElementException
*/
@Test
public void testOptionalGet(){
Optional objNull = Optional.ofNullable(null);
try {
System.out.println(objNull.get());
}catch (NoSuchElementException e) {
System.out.println(e.getMessage());
}
}
ifPresent
- 如果Optional实例有值则其调用consumer, 否则不做处理。
- 要理解ifPresent方法,首先要了解Consumer类。简答地说,Consumer类包含一个抽象方法。该抽象方法对传入的值进行处理,但没有返回值。 Java8支持不用接口直接通过lambda表达式传入参数。
/**
* 如果Optional实例有值则为其调用consumer ,否则不做处理。
*/
public static void main(String[] args){
Optional objNull1 = Optional.ofNullable(new User());
objNull1.ifPresent((value)->{
System.out.println(value);
});
Optional objNull2 = Optional.ofNullable(null);
objNull2.ifPresent((value)->{
System.out.println(value);
});
}
orElse
- 如果有值将其返回,否则返回指定的其它值。
- 如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。
/**
* 如果有值则将其返回,否则返回指定的其它值。
* 如果Optional实例有值则将其返回,否则返回orElse方法传入的参数
*/
@Test
public void testOptionalOrElse(){
Optional objNull = Optional.ofNullable(null);
System.out.println(objNull.orElse(new User()));
}
orElseGet
- orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
/**
* orElseGet与orElse方法类似,区别在于得到的默认值。
* orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。
*/
@Test
public void testOptionalOrElseGet(){
Optional objNull = Optional.ofNullable(null);
System.out.println(objNull.orElseGet(()->new User()));
}
orElseThrow
- 如果有值则将其返回,否则抛出supplier接口创建的异常。
在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。
/**
* 如果有值则将其返回,否则抛出supplier接口创建的异常。
* 在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。
*/
@Test
public void testOptionalOrElseThrow(){
Optional objNull = Optional.ofNullable(null);
try {
System.out.println(objNull.orElseThrow(ValueAbsentException::new));
}catch (Throwable ex) {
System.out.println(ex.getMessage());
}
}
public class ValueAbsentException extends Throwable{
public ValueAbsentException() {
super();
}
public ValueAbsentException(String msg) {
super(msg);
}
@Override
public String getMessage() {
return "No value present in the Optional instance";
}
}
map
- 如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。 map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。
/**
* 如果有值,则对其执行调用mapping函数得到返回值。
* 如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,
* 否则返回空Optional。
* map方法用来对Optional实例的值执行一系列操作。
* 通过一组实现了Function接口的lambda表达式传入操作。
*/
@Test
public void testOptionalMap(){
Optional<String> objNull = Optional.ofNullable("");
Optional<String> optionalS = objNull.map((value) -> value.toUpperCase());
System.out.println(optionalS.orElse("1"));
}
flatMap
- 如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。
/**
* 如果有值,则对其执行调用mapping函数得到返回值。
* 如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,
* 否则返回空Optional。
* map方法用来对Optional实例的值执行一系列操作。
* 通过一组实现了Function接口的lambda表达式传入操作。
*/
@Test
public void testOptionalFlatMap(){
Optional<String> objNull = Optional.ofNullable("");
Optional<String> optionalS = objNull.flatMap((value)->Optional.of(value.toUpperCase()));
System.out.println(optionalS.orElse("No value found"));
}
filter
- filter个方法通过传入限定条件对Optional实例的值进行过滤。
/**
* filter个方法通过传入限定条件对Optional实例的值进行过滤。
*/
@Test
public void testOptionalFilter(){
Optional<String> objNull = Optional.ofNullable("abcdefghijklmn");
Optional<String> optionalS = objNull.filter((item) -> item.indexOf("a") < 2);
System.out.println(optionalS.get());
}
上一篇: HashMap