今天学习到的一种新的防止空指针的方法
下面是我自己写的一个例子:
节省空间,bean的get set 省略...
/**
* 类目
* @author 唐
* @date 2018/5/6 17:45
* @Package com.imooc.dataobject
*/
public class ProductCategory {
/** 类目id .*/
private Integer categoryId;
/** 类目名称 .*/
private String categoryName;
/** 类目编号 .*/
private Integer categoryType; private ProductCategory productCategory;
}

ProductCategory productCategory=null;
Optional<ProductCategory> optional = Optional.ofNullable(productCategory);
System.out.println(optional.map(p -> p.getProductCategory()).map(pp -> pp.getCategoryName())
.orElse(null)); 这个例子可以看到我第一次调用的时候
productCategory=null
这个对象中还有一个自身对象的属性,我在第一次调用为空的时候,没有报错最后返回了一个null
这是jdk1.8才有的方法Optional Optional的3种构造方法
  • Optional.of(obj) 它要求传入的 obj 不能是 null 值的, 否则还没开始进入角色就倒在了 NullPointerException 异常上了.
  • Optional.ofNullable(obj)它以一种智能的, 宽容的方式来构造一个 Optional 实例. 来者不拒, 传 null 进到就得到 Optional.empty() , 非 null 就调用 Optional.of(obj) .
  • Optional.empty() 返回一个空的实例
还有些其他方法:
下面的是我在网上学习找到的
  1. isPresent()  //判断是否为空
  2. get()  //获取对象,如上例中的ProductCategory对象
  3. public<U> Optional<U> map(Function<? super T, ? extends U> mapper) //可以判断管理对象属性是否为空的
  4. public T orElse(T other)//出现意料之中的问题后做出的弥补,像语句中的else
  5. public T orElseGet(Supplier<? extends T> other)
  6. public void ifPresent(Consumer<? super T> consumer)
  7. public Optional<T> filter(Predicate<? super T> predicate)
  8. public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
  9. public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

 存在即返回, 无则提供默认值

return user.orElse(null);  //而不是 return user.isPresent() ? user.get() : null;
return user.orElse(UNKNOWN_USER);

 存在即返回, 无则由函数来产生

return user.orElseGet(() -> fetchAUserFromDatabase()); //而不要 return user.isPresent() ? user: fetchAUserFromDatabase();

  map 函数隆重登场

  当 user.isPresent() 为真, 获得它关联的 orders , 为假则返回一个空集合时, 我们用上面的 orElse , orElseGet 方法都乏力时, 那原本就是 map 函数的责任, 我们可以这样一行

  return user.map(u -> u.getOrders()).orElse(Collections.emptyList())

//上面避免了我们类似 Java 8 之前的做法
if(user.isPresent()) {
return user.get().getOrders();
} else {
return Collections.emptyList();
}

  map 是可能无限级联的, 比如再深一层, 获得用户名的大写形式

  return user.map(u -> u.getUsername())
   .map(name -> name.toUpperCase())
   .orElse(null);
 
 

学习笔记 Optional的更多相关文章

  1. JavaScript权威设计--JavaScript函数(简要学习笔记十一)

    1.函数调用的四种方式 第三种:构造函数调用 如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内.这和函数调用和方法调用是一致的.但如果构造函数没有形参,JavaScri ...

  2. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  3. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  4. swift学习笔记1——基础部分

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. ASP.Net MVC开发基础学习笔记:一、走向MVC模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. awk 学习笔记

    awk的语法有两种形式 awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s) 选 ...

  8. Guava学习笔记目录

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  9. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

随机推荐

  1. Linux下安装Python3.6

    1.安装Python3.6 依赖环境安装 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-deve ...

  2. unity室内外VR漫游

    这是一个用Unity 做的VR漫游小场景.

  3. 简单Socket网络通信

    问题:编写一个网络应用程序,有客户端和服务端,客户端向服务端发送一个字符串(如"Hello Socket"),服务器收到该 字符串后将其打印到命令行上,然后向客户端返回该字符串的长 ...

  4. seo相关知识

    网络营销菜鸟SEO入门必杀技(转载:http://blog.sina.com.cn/s/blog_5ef0fe8b0100n9cw.html) 搜索引擎优化(Search Engine Optimiz ...

  5. Centos7 Firewall

    1.1 firewall启停设置 [root@tomcat ~]# systemctl stop firewalld.service #关闭firewall [root@tomcat ~]# syst ...

  6. Python类之类的成员

    对于一个学C++的朋友来说,Python类中,哪些是私有成员,哪些是共有成员,估计一直傻傻分不清. 一.本篇博客要解决的问题: Python类中,哪些是私有成员?哪些是共有成员? 二. 关于Pytho ...

  7. C#中枚举的使用

    一.什么是枚举类型 枚举类型(也称为枚举):该类型可以是除 char以外的任何整型(重点). 枚举元素的默认基础类型为 int.准许使用的枚举类型有 byte.sbyte.short.ushort.i ...

  8. springboot使用redisTemplate遇到的问题

    概述 最近工作中新构建了一个项目,用的springboot,由于项目中要使用各种各样的缓存,就使用了spring-data-redis,这个东西比我想象中要难使用的多啊,而且我还遇到个问题,就是在用R ...

  9. 自己设置 WiFi

    不想安装免费WiFi? 简单,一行命令搞定 首先,打开你的 cmd 面板, 然后敲出命令: netsh wlan set hostednetwork mode=allow ssid=wifi key= ...

  10. erlang证书加密

    -module(...). -include("ewp.hrl").-include("backend.hrl").-include_lib("pub ...