Java8 : Optional 解析

自古以来, Java 开发者们都会遇到一个让人又爱又恨的异常: NullPointException, 为了解决这个问题, Java8 中新引入了一个工具叫做 Optional ,是用来存储对象并且去解决空对象问题的包装类, 用以避免产生 Java 中的空指针异常.

属性

private final T value;

Optional 对象中包装着一个泛型方法的对象, 当我们在包装类中存放着对应的方法的时候, 我们可以检验这个值是否存在,并且在适当的时候取出这个值来.

产生对象

    public static <T> Optional<T> of(T value);
    public static <T> Optional<T> ofNullable(T value);

Optional 对象有两个方法:

  • of 方法提供一个构造方法, 会将传入的对象引入 Optional 类的构造方法中, 默认构造方法会在调用时检查对象是否为 null , 如果为空的话,将会抛出一个空指针异常.
  • ofNullable 方法在调用构造器之前会提供一个事前检查,如果传入的对象为空的话,则会自动返回一个空的 Optional 对象,如果传入对象不为空的话,则 返回一个包含着该对象的包装类 .

检查对象

    public boolean isPresent();
    public void ifPresent(Consumer<? super T> consumer);
  • isPresent 方法返回对象是否存在,如果存在则返回 true 否则返回 false
  • ifPresent 方法传入一个消费函数, 当对应的值存在的时候, 则去执行对应的消费函数内容.

获取对象

    public T get();
    public T orElse(T other);
    public T orElseGet(Supplier<? extends T> other);
    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X;
  • get 方法将会检查包装类的值,如果为空的话则抛出一个 NoSuchElementException 异常. 不为空的话就返回对应的对象内容.
  • orElse 方法和 get 方法一样,会检查内容是否存在并且返回对象,但是有所不同的内容是, 当内容为空的时候将会返回默认的 other 的对象.
  • orElseGet 方法传入一个生产函数,和 orElse 方法类似,当对象内容为空的时候会自动的调用生产函数的内容,并且将函数生成的对象返回给方法.
  • orElseThrow 方法传入一个生产一个继承自 Throwable 的生产函数, 当对象内容为空的时候调用生产函数的方法, 并且将生产出来的 Throwable 对象抛出.

处理对象

    public Optional<T> filter(Predicate<? super T> predicate);
    public<U> Optional<U> map(Function<? super T, ? extends U> mapper);
    public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper);
  • filter 过滤器方法传入一个判断函数, 如果 Optional 对象中不包含任何元素, filter 方法返回一个空的 Optional 对象, 如果调用函数返回一个 false, 则会返回一个空的 Optional 对象, 如果返回 true, 则会得到现在的 Optional 对象.
  • map 方法传入一个 Function 函数, 并且取的其中的内容, 并对内容执行该函数,返回结果放入一个新的 Optional 对象中. 如果原有对象是空的,那么我们将会获得一个空的对象.
  • flatMap 方法也传入一个 Function 函数,但是这个函数是一个 V -> Optional<U> 的函数.它的实现和 map 方法相同.但是返回值是一个 Optional<U> 而不是一个 Optional<Optional<U>>�.

Optional 对象十分适合于包装各种不确定的返回数据. 但是其使用方式不是每次都获取其中的具体内容,或者每次调用 get 或者 isPresent 方法来确认内容是否存在.而是经常调用 filter, map 等方法直接对内容进行操作.直到获得最后的值.
具体的实现非常类似其他函数式编程语言的使用精髓.我们可以从中获取参考.

欢迎关注我的博客: 既然来了就坐坐吧
小站刚开始起步,欢迎您的驾到.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 1,192评论 1 2
  • 2016年5月25日星期三 21点26分 杨绛走了,已经走了20个小时。 从此,已经105岁的老人不再经受人间的冷...
    悦者阅读 708评论 3 5
  • 日已西落吹得晚风习, 透过帘幕聆听窗外语, 闻见鸟雀叽叽悲声惨凄凄, 秉烛夜游庭下小阶梯, 远方悠悠传来相思曲, ...
    执笔封神阅读 122评论 0 0
  • 国外有一只名叫杜拉(Thula)的缅因猫,两年前加入到了“疗愈猫”行列,成为了4岁自闭症女孩儿艾莉丝(Iris G...
    有宠阅读 500评论 0 1