Optional简述(Java8新特性)

news/2024/11/29 11:48:49/

Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException)。总而言之,就是对控制的一个判断,为了避免空指针异常。

一、引言

首先我们看下面一段代码,肯定会很熟悉

public static String getGender(Student student){if(null == student){return "Unkown";}return student.getGender();}

从上面看出,就是对这个实例是不是空做了判断,然后我们看下使用java8 的Optional类之后的代码,挺实用的。

public static String getGender(Student student){return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");}

二、Optional类介绍

Optional 类主要特点说明下:

  1. 构造方法是私有,不能new来创建,
  2. Optional的三个静态方法来创建对象,【empty()、of()、ofNullable()】
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);

三、Optional类的使用

1. get方法

        直接放回包装对象的实际值,为null抛出异常

2. isPresent方法

        判断包装对象是否为空

3.  ifPresent方法

        不为空时进行操作,内部自动判断null处理

public static void printName(Student student){Optional.ofNullable(student).ifPresent(u ->  System.out.println("The student name is : " + u.getName()));}

4. filter方法

        用于对Optional对象进行过滤

public static void filterAge(Student student){Optional.ofNullable(student).filter( u -> u.getAge() > 18).ifPresent(u ->  System.out.println("The student age is more than 18."));}

5. map方法

        map()方法的参数为Function(函数式接口)对象,map()方法将Optional中的包装对象用Function函数进行运算,并包装成新的Optional对象。

public static Optional<Integer> getAge(Student student){return Optional.ofNullable(student).map(u -> u.getAge()); }

6. flatMap方法

        map()方法不同的是,入参Function函数的返回值类型为Optional<U>类型,而不是U类型,这样flatMap()能将一个二维的Optional对象映射成一个一维的对象。

public static Optional<Integer> getAge(Student student){return Optional.ofNullable(student).flatMap(u -> Optional.ofNullable(u.getAge())); 
}

7. orElse方法

        如果包装对象值非空,返回包装对象值,否则返回入参other的值(默认值)。

public static String getGender(Student student){return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");}

8. orElseGet方法

        orElseGet()方法与orElse()方法类似,区别在于orElseGet()方法的入参为一个Supplier对象,用Supplier对象的get()方法的返回值作为默认值。

public static String getGender(Student student){return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown");      }

9. orElseThrow方法

        用于包装对象值为空时需要抛出特定异常的场景。

public static String getGender1(Student student){return Optional.ofNullable(student).map(u -> u.getGender()).orElseThrow(() -> new RuntimeException("Unkown"));      }

        Optional开发时要注意正确使用Optional格式,谨慎使用isPresent()和get()方法,尽量多使用map()、filter()、orElse()等方法来发挥Optional的作用。


http://www.ppmy.cn/news/382159.html

相关文章

ROS-melodic:源码安裝teb_local_planner算法、替换DWA算法

一.安裝teb_local_planner算法 源码下载地址&#xff1a;GitHub - rst-tu-dortmund/teb_local_planner: An optimal trajectory planner considering distinctive topologies for mobile robots based on Timed-Elastic-Bands (ROS Package) 注意选择对应ROS版本的代码。 放在…

远程复制服务器大于2g文件吗,ps保存文件太大_PS文件大于2G存不了怎么办

摘要 腾兴网为您分享:PS文件大于2G存不了怎么办&#xff0c;社会扶贫&#xff0c;闪动壁纸&#xff0c;每日一淘&#xff0c;老师说等软件知识&#xff0c;以及钢铁侠动态壁纸&#xff0c;甘肃教育&#xff0c;社保认证&#xff0c;华为mate8刷机包&#xff0c;赣教&#xff0c…

3d wallpaper android,3dwallpapers

3d wall papers app是一款最近比较受欢迎的3D立体动态壁纸设置免费软件&#xff0c;这里有非常齐全的立体视觉效果的手机壁纸可供选择&#xff0c;不断更新&#xff0c;试下流心风格图片&#xff0c;高清无水印&#xff0c;免费试用&#xff0c;支持重力传感器和陀螺仪效果是用…

为什么超三成制造企业上市公司选择用友U9 cloud?

导读&#xff1a;30%制造企业上市公司和40%专精特新制造业上市公司都选择用友U9 cloud 当前&#xff0c;数智化转型已经成为中国制造重构竞争力、实现高质量发展的必经之路。《“十四五”智能制造发展规划》提出&#xff0c;到2025年&#xff0c;70%的规模以上制造业企业基本实…

uniapp小程序中的相关设置

要让uniapp中的背景图片全屏&#xff0c;可以在<style>标签中添加以下样式&#xff1a; page { background-image: url(/static/bg.jpg); background-size: cover; background-repeat: no-repeat; background-position: center center; } 在这个样式中&…

盖茨预言AI助理成标配,AI+RPA打破AI准入高门槛!

根据微软联合创始人比尔盖茨的预测&#xff0c;未来顶级的人工智能公司将会开发一种全新的“个人AI助理”。比尔盖茨表示&#xff0c;“个人AI助理”将会具有出色的功能&#xff0c;可以改变人们的生活方式以及工作方式。无论哪一家公司能够赢得AI助理竞争先机&#xff0c;都会…

事件类积木8/16

大家好&#xff0c;今天我们来说一说编程猫事件类积木8/16&#xff0c;要将的积木有;当<>、停止【全部脚本】、停止、重启。 1、当<> 当<>的意思是事件的开端&#xff1a;当满足指定条件&#xff0c;即事件被触发时&#xff0c;立即执行这块积木下的脚本积…

A Game of Thrones(79)

44.SANSA(0) He wouldn’t send Ser Loras,” Sansa told Jeyne Poole that night as they shared a cold supper by lamplight. “I think it was because of his leg.” Lord Eddard had taken his supper in his bedchamber with Alyn, Harwin, and Vayon Poole, the be…