1:Optional

  1.1 概述

  Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException),提供了一些的方法代替过去的if-else处理逻辑,并与Stream流结合提供一致性的函数式编程.

注意: Optional 不支持Java本身提供的序列化与反序列化机制,也就是RPC不能使用Java提供的序列化机制

  1.2 方法概览

  页面 看不清,请下载或者另一个页面打开即可看清楚

2: 常用方法

2.1 构造方法

  •   需要提前检查NPE 使用of方法
  •   不管情况直接构造 使用ofNULLable*()方法
    •   empty() 方法 前面方法间接使用了这个方法
@Test(expected = NoSuchElementException.class)
public void whenCreateEmptyOptional_thenNull() {
Optional<User> emptyOpt = Optional.empty();
emptyOpt.get();// 没有值 将会抛出异常
} @Test(expected = NullPointerException.class)
public void test_of() {
User user=null;
Optional<User> optional = Optional.of(user);
} @Test
public void test_ofNuLLAble() {
User user=null;
Optional<User> optional = Optional.ofNullable(user);
optional.orElse(new User());
// 一般不使用 optional.get();
}

2.2 取得值

  •  get方法取不到值将会抛出异常NPE
  • orElse系列方法,在null值的情况 将会提供默认值
// 取得值
@Test
public void test_getValue() {
Optional<String> opt = Optional.ofNullable(null);
String str = opt.get();
String str2 = opt.orElse("Tom");
Assert.assertEquals("Tom", str2);
String str3 = opt.orElseGet(()->"Tom2");
Assert.assertEquals("Tom2", str3);
}

2.3 检查处理

// 检查处理
@Test
public void test_Check() {
Optional<String> opt = Optional.ofNullable(null); Assert.assertTrue(opt.isEmpty());
Assert.assertFalse(opt.isPresent());//not null if(opt.isPresent()) {
String string = opt.get().toUpperCase();
}
opt.ifPresent(x->x.toUpperCase()); //解决了if 问题 代码简洁 // 内部是runable 不能返回值 所以值这个方法功能有限 但是可以执行一些耗时操作
opt.ifPresentOrElse(x->x.toUpperCase(),()->System.out.println("sss"));
}

2.4 返回值

@Test
public void test_returnValue() {
Optional<String> opt = Optional.ofNullable(null); Assert.assertEquals("Cat", opt.orElse("Cat"));
Assert.assertEquals("Cat", opt.orElseGet(()->"Cat"));
// or 为jdk9 新方法
String str_tom = opt.or(()->Optional.of("Tom")).get();
Assert.assertEquals("Tom", str_tom);
}

2.5 返回异常

@Test(expected = NoSuchElementException.class)
public void test_return_Exception() {
Optional<String> opt = Optional.ofNullable(null); Assert.assertEquals("Cat", opt.orElseThrow()); Assert.assertEquals("Cat", opt.orElseThrow(()->new NoSuchElementException()));
}

2.6 转换 与过滤

@Test
public void test_MapAndFilter() {
String [] str= new String[] {"a","b","c","d","1"};
Optional<String[]> opt = Optional.ofNullable(str); // filter
String[] res = opt.filter(x->{
for (String s : x) {
if(s.contains("e")) {
return false;
}
}
return true;
}).get();
System.out.println(Arrays.toString(res));
// map 转大小
List<String> list=new ArrayList<>();
for(String x:str) {list.add(x);}; Optional<String> map = Optional.ofNullable(list).map(x->x.iterator().next().toUpperCase());
List<String> list2 = Optional.ofNullable(list).stream().
flatMap(x->x.stream().map(y->y.toUpperCase())).collect(Collectors.toList());
System.out.println(list2);
}

2.7 链式操作

  •   支持链式操作,序列化滞后
@Test
public void Test_ChainCollec() {
Street street = new Street("武汉轻工大学", 5);
Address address = new Address(street);
Person person = new Person("Tom", 12,address ); String string = Optional.ofNullable(person).
flatMap(u->u.getAddress())
.flatMap(p->p.getStreet())
.map(l->l.getStreetName())
.orElse("default");
System.out.println(string); Address address2 = new Address(null);
Person person2 = new Person("Tom", 12,null);
String s3 = Optional.ofNullable(person2).flatMap(u->u.getAddress())
.orElse(new Address(null))
.getStreet()
.orElse(new Street("武汉大学", 1))
.getStreetName();
System.out.println(s3);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream obr;
try {
obr = new ObjectOutputStream(bos);
obr.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
} ByteArrayInputStream inputStream = new ByteArrayInputStream(bos.toByteArray());
try {
ObjectInputStream inputStream2 = new ObjectInputStream(inputStream);
Person person23 = (Person) inputStream2.readObject();
System.out.println(person23.getAddress().get().getStreet().get().getStreetName());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

其他代码

class Person implements Serializable{
private String name;
private Integer age;
private Address address; public Person(String name, Integer age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Optional<Address> getAddress() {
return Optional.ofNullable(this.address);
} public void setAddress(Address address) {
this.address = address;
}
} class Address implements Serializable{
private Street street ; public Optional<Street> getStreet() {
return Optional.ofNullable(this.street);
}
public void setStreet(Street street) {
this.street = street;
}
public Address(Street street) {
super();
this.street = street;
}
} class Street implements Serializable{
private String streetName ;
private Integer streetNo; public Street(String streetName, Integer streetNo) {
this.streetName = streetName;
this.streetNo = streetNo;
} public String getStreetName() {
return streetName;
} public void setStreetName(String streetName) {
this.streetName = streetName;
} public Integer getStreetNo() {
return streetNo;
} public void setStreetNo(Integer streetNo) {
this.streetNo = streetNo;
}
}

详解Java8 Optional类{最全}的更多相关文章

  1. 详解Java8的日期和时间API

    详解Java8的日期和时间API 在JDK1.0的时候,Java引入了java.util.Date来处理日期和时间:在JDK1.1的时候又引入了功能更强大的java.util.Calendar,但是C ...

  2. 详解javascript的类

    前言 生活有度,人生添寿. 原文地址:详解javascript的类 博主博客地址:Damonare的个人博客 Javascript从当初的一个"弹窗语言",一步步发展成为现在前后端 ...

  3. CSS选择器详解(伪类) 转 http://blog.csdn.net/Panda_m/article/details/50084699

    CSS选择器详解 之 伪类 伪类对大小写不敏感 结构伪类选择器 结构伪类是CSS3新增的类型选择器,利用DOM树实现元素过滤,通过文档结构的相互关系来匹配元素,可以减少class和id属性的定义,使文 ...

  4. 详解 QT 主要类 QWidget

    QWidget类是所有用户界面对象的基类,每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. 先来看内容. AD: 2013云计算架构师 ...

  5. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  6. 详解Java8特性之新的日期时间 API

    详解Java8特性之新的日期时间 API http://blog.csdn.net/timheath/article/details/71326329 Java8中时间日期库的20个常用使用示例 ht ...

  7. OkHttp3源码详解(一) Request类

    每一次网络请求都是一个Request,Request是对url,method,header,body的封装,也是对Http协议中请求行,请求头,实体内容的封装 public final class R ...

  8. struts2-环境搭建-访问流程-配置详解-常量配置-类详解

    1 struts2概述 1.1 概念  1.2 struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 struts2具有更加先进的架构以 ...

  9. Java泛型详解,史上最全图文详解!

    泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它. 毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课. 一:泛型本质 Java 泛型(gen ...

随机推荐

  1. redis的安装和pip连接

    一.首先说说我的环境.         操作系统:Ubuntu16.04         能联网(使用了桥接方式)   二.安装redis cd进一个文件夹. 控制台输入     weget http ...

  2. Spring 梳理 - 开启并配置 Spring MVC 的方法

    传统web.xm中配置两个上下文+两个context对应的xml+两个上下文bean分别手动配置 传统web.xm中配置两个上下文+两个context对应的xml+<mvc:annotation ...

  3. java异常类的妙用

    异常类的妙用   以往在使用异常时,只是知道通过异常类的构造方法设置一些出错信息,此外最多就是把引起该异常的原因通过Throwable类的子类一同设置进去.今天在分析springSecurity3.0 ...

  4. 【原创】(六)Linux内存管理 - zoned page frame allocator - 1

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  5. navicat for mysql中使用模型?

    登录进数据库后,点击模型--新建模型,如下 点击“小手”下面的图标----双击右边的空白处,即出现一个表格,可命名,此时我们命名为A 双击A表下空白处---即可设计A表属性,点确定.如下 同理,生成一 ...

  6. python win32com 读取带密码的excel

    之前用到的win32com读取带密码excel的相关内容,今天刚好准备整理下,突然发现方法又不灵了. 以下为错误示范: # 已知excel密码去除 def del_password(filename, ...

  7. linux下安装Elasticsearch

    一.简单介绍: Elasticsearch提供了近乎实时的数据操作和搜索功能,es集群中所有节点可以一起提供索引和搜索功能,能够相互发现彼此和自动地加入到集群中 二.基础概念: 1.索引: 表征的文档 ...

  8. Android通过外部浏览器调用微信H5支付,Android+PHP详解

    看了好多关于讲解微信H5支付开发的文章,大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付),可能是因为H5支付接口刚开放不久吧. 微信官方体验链接:http://wxpay.wxutil ...

  9. mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

    hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴. 下期我们将继续分享go语言的系列讲解, ...

  10. Redis未授权访问漏洞复现

    Redis未授权访问漏洞复现 一.漏洞描述 Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没 ...