一卷旌收千骑虏,万全身出百重围。这篇文章主要讲述Java基础之Optional类(JDK1.8新特性)相关的知识,希望能为你提供帮助。
定义Optional是一个容器,它可以保存类型T的值,或者仅仅保存null,Optional类主要是用来避免空指针异常(NPE),其提供的一系列的方法配合Lambda表达式可以让代码更加清晰,语义化,以及避免了空指针异常的问题,这里要注意是避免空指针异常,而不是避免返回null。
Optional方法的使用
- empty 方法返回一个不包含值的Optional实例,注意不保证返回的empty是单例,不要用==比较。
public static< T> Optional< T> empty()
- of 方法返回一个Optional实例,传入的值必须是非空值,传入null会抛出空指针异常。
public static < T> Optional< T> of(T value)
- 返回一个Optional实例,如果传入值非空,则实例中包含非空值,如果传入null,返回不包含值的empty
public static < T> Optional< T> ofNullable(T value)
- isPresent 方法用来判断实例是否包含值,如果不包含非空值返回false,否则返回true
public boolean isPresent();
- get方法,如果实例包含值则返回当前值,否则抛出NoSushElementException 异常.
public T get();
不推荐调用上面两个方法,因为容易写出如下代码,比原先判断if null的代码还要脏
public static String getUserName1(User user)
Optional< User> user1 = Optional.ofNullable(user);
if (!user1.isPresent())
return "参数为空";
return user1.get().getName();
下面是用if-null
public static String getUserName(User user)
if (user == null)
return "参数为空";
return user.getName();
- ifPresent(Consumer consumer):如果option对象保存的值不是null,则调用consumer对象,否则不调用
public void ifPresent(Consumer< ? super T> consumer);
代码示例:
Optional< Integer> optional1 = Optional.ofNullable(1);
Optional< Object> optional2 = Optional.ofNullable(null);
//如果不是null,调用Consumer
optional1.ifPresent(t -> System.out.println("value is" + t)); //value is1
//如果是null,不调用Consumer
optional2.ifPresent(t -> System.out.println("value is " + t));
如上代码,输出结果是 第一条 语句输出?
?value is1?
??,第二条语句没有输出7. filter方法如果值存在,并且这个值匹配给定的predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional
Optional< T> filter(Predicate< ? super < T> predicate)
代码示例:
Optional< Integer> optional1 = Optional.ofNullable(1);
Optional< Object> optional2 = Optional.ofNullable(null);
Optional< Integer> filter1 = optional1.filter(a -> a == null);
Optional< Integer> filter2 = optional1.filter((a) -> a == 1);
Optional< Object> filter3 = optional2.filter(a -> a == null);
System.out.println(filter1.isPresent()); //false
System.out.println(filter2.isPresent()); //true
System.out.println(filter2.get().intValue() == 1); //true
System.out.println(filter3.isPresent()); //false
如上代码,演示了filter方法如何使用,输出结果如代码注释所示。
8. map(Function):对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)
public< U> Optional< U> map(Function< ? super T, ? extends U> mapper);
代码示例:输出结果已经写在注释中。
Optional< Integer> optional1 = Optional.ofNullable(1);
Optional< Object> optional2 = Optional.ofNullable(null);
Optional< String> str1Optional = optional1.map(a -> "key" + a);
Optional< String> str2Optional = optional2.map(a -> "key" + a);
System.out.println(str1Optional.get()); //key1
System.out.println(str2Optional.isPresent()); //false
- flatMap():功能与map()相似,差别在返回值不同,flatMap方法的mapping函数返回值可以是任何类型T,而map方法的mapping函数必须是Optional
public< U> Optional< U> flatMap(Function< ? super T, Optional< U> > mapper);
【Java基础之Optional类(JDK1.8新特性)】代码示例:
Optional< Integer> optional1 =推荐阅读
- 小白一看就会的Spring的RestTemplate的使用
- 使用Python监控邮件服务器公网IP是否被列入黑名单并及时告警
- Powershell实现多硬盘的电脑使用SCCM安装系统选择目的盘清单
- 记一次nginx405的错误
- JS 变量作用域与内存
- Java基础之方法引用(JDK1.8新特性)
- [ C++ ] 类与对象(下)日期类Date补充及流提取和流插入运算符重载
- Java基础之Stream流(JDK1.8新特性)
- HarmonyOS - 实现多设备协同