JAVA 8 新特性 __ Optional 类

时间:2022-09-22 19:47:52
  1. Optional 类是一个可以作为null容器的对象,若值存在调用isPresent()就返回 true,调用get()会返回该对象。

  2. Optional是一个容器,可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,我们可以不用那么拙劣的检测空值。

  3. 使用Option可以很好解决的NPE

类声明

public final class Optional<T> extends Object()

类方法

I、of

返回一个指定非null的Optional值

//调用工厂创建Optional的实例
Optional<String> name = Optional.of("孙舒蕊");
//传入参数为Null,抛出NPE
Optional<String> someNull = Optional.of(null);

II、ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。

ofNullable 与 of 的方法相似,唯一的区别是可以接受参数为null的情况。

//创建一个不包含任何值得Optional
Optional empty = Optional.ofNullable(null);

III、ifPresent

如果Optional实例有值则为其调用 consumer,否则不做处理

如果Optional实例有值,调用ifPresent()可以接受接口或lambda表达式。

name.ifPresent((value) -> {
System.out.println("===="+value.length());
})

VI、orElse

如果有值则将其返回,否则返回指定的其他的值

如果Optional实例有值则将其返回,否则返回orElse的方法参数。

//如果值不为null,orElse方法返回Optional实例的值。
//如果为null,返回传入的消息。
//输出:There is no value present!
System.out.println(empty.orElse("There is no value present!"));
//输出:Sanaulla
System.out.println(name.orElse("There is some value!"));

V、orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。

//orElseGet与orElse方法类似,区别在于orElse传入的是默认值,
//orElseGet可以接受一个lambda表达式生成默认值。
//输出:Default Value
System.out.println(empty.orElseGet(() -> "Default Value"));
//输出:Sanaulla
System.out.println(name.orElseGet(() -> "Default Value"));

VI、map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

//map方法执行传入的lambda表达式参数对Optional实例进行修改
//为lambda表达式的返回值创建新的Optional实例作为 map 的方法返回值
Optional<String> upperName= name.map((vlaue) -> value.toUpperCase());
System.out.println(upperName.orElse(" "));

VII、flatMap

如果有值,为其执行mapping函数返回值,否则返回空的Optional。flatMap和map(Function) 方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会结果用Optional封装。

flatMap方法与map方法类似,区别在于mapping函数的返回值不同 。map方法的mapping函数返回值可以使任何类型T,而flatMap方法的参数map函数,使用flatMap重写的示例如下。

//flatMap 与 map(Function) 非常类似,区别在于传入方法的lambda表达式的返回值类型
//map方法中的lambda表达式的返回值是可以任意类型的,在map函数返回之前会包装成Optional,
//但是flatMap方法中的lambda表达式返回值必须是Optional的实例
upperName=name.flatMap((value) -> Optional.of(value.toUpperCase()));
System.out.println(upperName.orElse("No value found"));
//输出SANAULLA

VIII、filter

//filter方法检查给定的Optional值是否满足某些条件
//如果满足返回一个Optional实例,否则返回空的Optional
Optional<String> name=Optional.of("Christina");
Optional<String> longName=name.filter((value) -> value.length() > 6);
System.out.println(longName.orElse("这个人的名字没有六个字符大1"));
//下面的例子不满足
Optional<String> anotherName=Optional.of("Sana");
Optional<String> shortName=anotherName.filter((value) -> value.length()>6);
System.out.println(shortName.orElse("这个人的名字没有六个字符大2")); ===================输出================================
Christina
这个人的名字没有六个字符大2

JAVA 8 新特性 __ Optional 类的更多相关文章

  1. java8新特性之Optional类

    NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...

  2. 010-jdk1&period;8版本新特性二-Optional类,Stream流

    1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个 ...

  3. Java 8新特性之 Optional(八恶人-5)

    Oswaldo Mobray 莫博瑞·奥斯瓦尔多 “I‘m Oswaldo Mobray, the hangman in these parts.” “我是莫博瑞·奥斯瓦尔多,这片地区的绞刑官.” 一 ...

  4. java8新特性六-Optional 类

    Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者仅仅保 ...

  5. Java 12 新特性介绍,快来补一补

    Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Java 11 新特性介绍 J ...

  6. Spring 4支持的Java 8新特性一览

    有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...

  7. Java 8 新特性终极版

    声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...

  8. Java 8新特性前瞻

    快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...

  9. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

随机推荐

  1. &lbrack;Java Web整合开发王者归来&&num;183&semi;刘京华&rsqb; 1、 Java Web开发

      目录: 1.Web技术简介 2.动态网站与静态网站 3.Java Web开发模式 4.JavaScript简介 1.Web技术简介 PS: 最近还有更凶残的技术,即整个操作系统都是基于Web的,如 ...

  2. java 21-11 数据输入、输出流和内存操作流

    IO数据流: 可以读写基本数据类型的数据 数据输入流:DataInputStream DataInputStream(InputStream in)   数据输出流:DataOutputStream ...

  3. C&num; ASP&period;NET 开发指引简要

    推荐学习交流社区:博客园http://www.cnblogs.com/ 里面有很多技术.职业圈子等信息的分享,新手必逛社区. 电子书等资源下载:csdn下载 http://download.csdn. ...

  4. hadoop配置错误

    经过上一周的郁闷期(拖延症引发的郁闷),今天终于开始步入正轨了.今天主要是解决hadoop配置的错误以及网络时断时续的问题. 首先说明一下之前按照这篇文章的方法配置完全没有问题,但是等我配置好了发现h ...

  5. 判断DataSet是否有数据

    if (data1.Tables[0].Rows.Count>0)        {            MessageInfoText.Text = data1.Tables[0].Rows ...

  6. Eclipse 输入出错时自动查找类

    经常会只记得类的前半部分名称,这时可以双击这个没写完的类名,然后会弹出选择框:

  7. bootstrap-treeview 如何实现全选父节点下所有子节点及反选

    转(https://www.augsky.com/992.html) 选中父节点时,父节点下所有子节点也都全部选中 1,HTML代码 <h2>TreeView Checkable</ ...

  8. ionic android返回键

    每次点击返回键只会执行一个事件, 在自定义事件中要控制条件不满足时实行原默认动作. 如果只在一个view中监控, 还需要及时注销事件. http://www.jianshu.com/p/b567cc6 ...

  9. vue父子组件传递参数之props

    vue中父组件通过props传递数据给子组件, props有两种传递方式 1.props:['msg']2.props: { msg:{ type:String, default:"&quo ...

  10. input type&equals;file 选择图片并且实现预览效果的实例

    为大家带来一篇input type=file 选择图片并且实现预览效果的实例. 通过<input />标签,给它指定type类型为file,可提供文件上传: accept:可选择上传类型, ...