Java 8——Optional
本文主要介绍Java 8的 Optional 的简单使用
Address
|
1
2
3
4
5
6
7
|
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
private String province;
private String city;
}
|
of + ofNullable
相关代码托管在java8_demo
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@Test(expected = NoSuchElementException.class)
public void emptyTest() {
// 声明一个空的Optional对象
Optional<Address> nameOptional = Optional.empty();
// java.util.NoSuchElementException: No value present
nameOptional.get();
}
@Test(expected = NullPointerException.class)
public void ofNullTest() {
// 依据实例创建Optional对象
Optional.of(new Address("Guangdong", "Zhongshan"));
// Optional.ofNullable(null)返回Optional.empty()
assertEquals(Optional.empty(), Optional.ofNullable(null));
// java.lang.NullPointerException
Optional.of(null);
}
|
map
Stream.map的定义:<R> Stream<R> map(Function<? super T, ? extends R> mapper)Optional.map的定义:<U> Optional<U> map(Function<? super T, ? extends U> mapper)- 上面两者定义非常类似,
Optional可看成最多包含一个元素的Stream

|
1
2
3
4
5
6
7
8
9
10
11
|
@Test
public void mapTest() {
String province = "Guangdong";
String city = "Zhongshan";
Optional<Address> addressOptional = Optional.of(new Address(province, city));
// mapper : Address -> String
// Optional<Address> -> Optional<String>
Optional<String> stringOptional = addressOptional.map(Address::getCity);
assertTrue(stringOptional.isPresent());
assertEquals(city, stringOptional.get());
}
|
flatMap
Stream.flatMap的定义:<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)Optional.flatMap的定义:<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)

|
1
2
3
4
5
6
7
8
9
10
11
12
|
@Test
public void flatmapTest() {
String province = "Guangdong";
String city = "Zhongshan";
Optional<Address> addressOptional = Optional.of(new Address(province, city));
// 对于 mapper 为 T -> Optional<U>时,调用Optional.map,生成的是Optional<Optional<U>>
Optional<Optional<String>> optionalOptional = addressOptional.map(address -> Optional.ofNullable(address.getCity()));
// 对于 mapper 为 T -> Optional<U>时,调用Optional.map,生成的是Optional<U>,被扁平化
Optional<String> stringOptional = addressOptional.flatMap(address -> Optional.ofNullable(address.getCity()));
assertTrue(stringOptional.isPresent());
assertEquals(city, stringOptional.get());
}
|
解引用
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@Test(expected = UnsupportedOperationException.class)
public void dereferenceTest() {
// get:最简单 + 最不安全
Address address = addressOptional.get();
assertNotNull(address);
address = null;
Optional<Address> emptyAddressOptional = Optional.ofNullable(address);
String defaultValue = "Unknown";
// orElse:设置默认值
Address elseAddress = emptyAddressOptional.orElse(new Address(defaultValue, defaultValue));
assertEquals(defaultValue, elseAddress.getProvince());
assertEquals(defaultValue, elseAddress.getCity());
// orElseGet:orElse的延迟调用版本
Address elseGetAddress = emptyAddressOptional.orElseGet(Address::new);
assertNull(elseGetAddress.getProvince());
assertNull(elseGetAddress.getCity());
// ifPresent:存在值则运行consumer,否则不进行任何操作
emptyAddressOptional.ifPresent(System.out::println);
// orElseThrow:不存在时,抛出异常
emptyAddressOptional.orElseThrow(UnsupportedOperationException::new);
}
|
filter
|
1
2
3
4
|
@Test
public void filterTest() {
assertTrue(addressOptional.filter(address -> address.getCity().contains("Z")).isPresent());
}
|
基础类型 + Optional
OptionalInt、OptionalLong、OptionalDouble- 最多
只有一个元素,并没有像StreamInt那样相对于Stream<Integer>有性能优势 - 不支持
map、flatmap、filter
Java 8——Optional的更多相关文章
- JAVA 8 Optional类介绍及其源码
什么是Optional对象 Java 8中所谓的Optional对象,即一个容器对象,该对象可以包含一个null或非null值.如果该值不为null,则调用isPresent()方法将返回true,且 ...
- Java 8 Optional 类
转自:https://www.runoob.com/java/java8-optional-class.html Optional 类是一个可以为null的容器对象.如果值存在则isPresent() ...
- Java中Optional类的使用
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...
- Java 8 新特性-菜鸟教程 (6) -Java 8 Optional 类
Java 8 Optional 类 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容 ...
- jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional, 原 Inferred type 'S' for type parameter 'S' is not within its bound;
jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional 在使用springboot 方法报错: Inferred type 'S' for type para ...
- java中Optional和Stream流的部分操作
package test9; import java.util.DoubleSummaryStatistics; import java.util.Optional; import java.util ...
- Java 8 Optional In Depth
OptionalBasicExample.java package com.mkyong; import java.util.Optional; public class OptionalBasicE ...
- Java 8 Optional 类深度解析
Java 8 Optional 类深度解析 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只 ...
- Java 8 Optional类使用的实践经验
前言 Java中空指针异常(NPE)一直是令开发者头疼的问题.Java 8引入了一个新的Optional类,使用该类可以尽可能地防止出现空指针异常. Optional 类是一个可以为null的容器对象 ...
- Java 8 中的 java.util.Optional
Java 8 中的 java.util.Optional 学习了:https://blog.csdn.net/sun_promise/article/details/51362838 package ...
随机推荐
- org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6709758.html Android Studio导入项目报错: org.gradle.api.inter ...
- 使用Maven整合SSM总结
项目环境: spring-4.3.7 + mybatis-3.3.0 + maven-3.3.9 + oracle11g 1. 首先使用maven引入相关依赖: pom.xml: <projec ...
- javascript中json对象json数组json字符串互转及取值
今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下: 1.json类型的字符串转换为json对象及取值 var jsonString = '{"bar" ...
- openMP编程(上篇)之指令和锁
openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...
- App启动页倒计时功能
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6753418.html 示例代码采用 RxJava + RxLifecycle + Data-Binding ...
- Magento中URL路径的获取
//获得 media 带 http 的url 地址. Mage::getBaseUrl('media') //获得skin 和js 目录的地址: Mage::getBaseUrl('skin'); M ...
- FrameBuffer系列 之 相关结构与结构体
在linux中,fb设备驱动的源码主要在Fb.h (linux2.6.28\include\linux)和Fbmem.c(linux2.6.28\drivers\video)两个文件中,它们是fb设备 ...
- java并发程序——并发容器
概述 java cocurrent包提供了很多并发容器,在提供并发控制的前提下,通过优化,提升性能.本文主要讨论常见的并发容器的实现机制和绝妙之处,但并不会对所有实现细节面面俱到. 为什么JUC需要提 ...
- EasyUI开发的驾校管理系统
开源SmartLife驾校管理系统,地址:https://github.com/SmartOfLife/DriveMgr 1.界面布局是用的ymnets大神的界面,具体参考:http://www.cn ...
- 关于[JAVA] Apache FTPClient.listFiles()操作“卡死”问题的分析和解决
项目中使用commons-net-3.0.1.jar实现FTP文件的下载,程序运行到 FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里 ...