乐字节-Java8新特性之Optional
上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional
Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。
1、of
为非null的值创建一个Optional,如果值为null,则会抛出NullPointerException
Optional<Integer> optional = Optional.of(13);
System.out.println(optional)
2、ofNullable
为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
3、isPresent
如果值存在返回true,否则返回false。
Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
System.out.println(optional2.isPresent());
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());
4、get
如果Optional有值则将其返回,否则抛出NoSuchElementException。
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());
System.out.println(optional2.get());
5、ifPresent
如果Optional实例有值则为其调用consumer,否则不做处理 。隐士地其中进行了null判断。
public static void main(String[] args) {
String str1 = "hello";
String str2 = null;
Optional<String> optional1 = Optional.ofNullable(str1);
Optional<String> optional2 = Optional.ofNullable(str2);
optional1.ifPresent(str->System.out.println(str.length()));
optional2.ifPresent(str-> System.out.println(str.length()));
}
6、orElse
如果有值则将其返回,否则返回指定的其它值。
public static void main(String[] args) {
String str1 = "hello";
String str2 = null;
Optional<String> optional1 = Optional.ofNullable(str1);
Optional<String> optional2 = Optional.ofNullable(str2);
System.out.println(optional1.orElse("默认字符串"));
System.out.println(optional2.orElse("默认字符串"));
}
7、orElseGet
orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的一个值作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
public static void main(String[] args) {
Integer i = 20;
Optional<Integer> op = Optional.ofNullable(i);
System.out.println(op.orElseGet(()->0));
System.out.println(Optional.ofNullable(null).orElseGet(()->0));
}
8、orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
public static void main(String[] args) {
// 自己指定异常
System.out.println((Optional.ofNullable("a").orElseThrow(()->new IndexOutOfBoundsException())));
System.out.println((Optional.ofNullable(null).orElseThrow(()->new IndexOutOfBoundsException())));
}
9、map
map处理有值的情况,如果有值,则对其执行调用map参数中的函数得到返回值,否则返回空Optional。
public static void main(String[] args) {
List<String> list = new ArrayList<String>(){
{
add("aaa");
add("bbb");
add(null);
}
};
list.stream().forEach(temp ->{
Optional<String> opt = Optional.ofNullable(temp);
System.out.println(opt.map(n -> {
return n.toUpperCase();
}).orElse("Nothing"));
});
// 简写为如下形式
list.stream().forEach(temp->{
System.out.println(Optional.ofNullable(temp).map(n->n.toUpperCase()).orElse("Nothing"));
});
}
10、flatMap
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。 可以将内容
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable("aaa");
Optional<String> opt2 = Optional.ofNullable(null);
System.out.println(opt1.flatMap(n->{
return Optional.ofNullable(n.toUpperCase());
}).orElse("还会没有吗"));
System.out.println( opt2.flatMap(n->{
return Optional.ofNullable(n.toUpperCase());
}).orElse("还会没有吗"));
}
11、filter
如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable("aabbbbaa");
Optional<String> opt2 = Optional.ofNullable(null);
System.out.println(opt1.filter(value->value.length()>6));
System.out.println(opt2.filter(value->value.length()>6));
}
好了,Java8新特性之Optional就介绍到这里了,接下去小乐将会继续带大家了解Java8新特性,请继续关注,转载请说明出处和作者。
乐字节-Java8新特性之Optional的更多相关文章
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- 乐字节-Java8新特性之Base64和重复注解与类型注解
上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...
- 乐字节-Java8新特性之Date API
上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...
- 乐字节-Java8新特性-接口默认方法之Stream流(下)
接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- 乐字节-Java8新特性之Stream流(上)
上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...
- 乐字节-Java8新特性之函数式接口
上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- 乐字节Java8核心特性之Optional类
大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...
随机推荐
- 微服务 - Eureka注册中心
我们来解决微服务的第一问题,服务的管理. 服务中心对外提供服务,需要对外暴露自己的地址.而consumer(调用者)需要记录服务提供者的地址.将来地址出现变更,还需要及时更新.这在服务较少的时候并不觉 ...
- “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 友链&&日记
上面友链,下面日记 友人链 最喜欢galgameの加藤聚聚 初三一本&&\(ACG\)姿势比我还丰厚的yx巨巨 更喜欢galgame的shadowice czx ZigZag胖胖 文文 ...
- 08_python_文件操作
一.初始文件操作 打开⽂件的⽅式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤的是r(只读)模式 f = open("少妇嫩模.t ...
- is和 == 的区别以及编码.解码
一.is和==的区别 1,id( ) id( )是python的一个内置函数,通过id( )我们可以查看到一个变量表的值在内存中的地址: s = 2 print(id(s)) # 1514368064 ...
- InfluxDB概念和基本操作
InfluxDB基本概念 数据格式 在 InfluxDB 中,我们可以粗略的将要存入的一条数据看作一个虚拟的 key 和其对应的 value(field value).格式如下: cpu_usage, ...
- linux安装mysql数据库和简单配置
- Vim实用技巧系列 - 利用百度云和git实现vim配置多机共享
Vim是一个强大的文本编辑器.良好的配置更能便利对Vim的使用.有时候,我们会在几台不同的电脑上使用Vim. 例如,我们可能在自己的电脑和公司的电脑上都安装了Vim. 有时候,我们需要实现,如果我们配 ...
- AndroidStudio打包apk,安装出现签名冲突--解决办法
Android UiAutomator2项目部署到jenkins上,实现自动打包,并自动push&安装到设备上 遇到问题: 可成功实现自动打包并push到设备上后,install -r 的时候 ...
- [Umbraco] 在umbraco中开发xlst的小窍门
当你在umbraco开发xslt时也可以调用C#里的方法,具体方法参考如下 点击第二个按钮 点击右侧的"Get Extensions" 系统自带了工具类,里面有很多常用也很实用的方 ...