乐字节-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)是一个容器类,代表一个值存在 ...
随机推荐
- 深入字节码理解invokeSuper无限循环的原因
来一段简单的cglib代码 public class SampleClass { public void test(){ System.out.println("hello world&qu ...
- joi库 学习笔记
零.背景 node.js 应用中,req.query / req.body 传来的参数需要做 valication( 合法性验证 ) 一.安装 https://github.com/hapijs/jo ...
- Python之tkinter中的askyescancel窗口返回值
if messagebox.askokcancel(title="确认取消",message="您确认注册该账号吗?"): messagebox.showinf ...
- SQLAlchemy介绍和基本使用
pymysql:pymysql是用Python来操作mysql的包,因此通过pip来安装,命令如下:pip3 install pymysql.如果您用的是Python 3,请安装pymysql 豆瓣源 ...
- sql必知必会
1.根据条件查询数据库中数据,并返回数据条数 去掉count就会返回数据库中符合条件的所有数据 SELECT COUNT(*) FROM sentiment_info WHERE sentiment_ ...
- K-means算法的原理、优缺点及改进(转)
文章内容转载自:http://blog.csdn.net/sinat_35512245/article/details/55051306 ...
- mac下安装rzsz
1.先安装item2,item2 市类似mac风格的终端 item2 下载地址,http://iterm2.com/downloads.html,下载后解压缩就能运行 2.Install Homebr ...
- System.Threading.Tasks.Task 引起的 IIS 应用池崩溃
接口服务运行一段时间后,IIS应用池就会突然挂掉,事件查看日志,会有事件日志Event ID为5011的错误 为应用程序池“PokeIn”提供服务的进程在与 Windows Process Activ ...
- 前端组件化Polymer入门教程(7)——Local DOM
DOM元素的创建和管理被称为本地DOM(Local DOM) 本地DOM模板 如果你需要使用本地DOM,你们需要用<dom-module>并指定一个相匹配的ID. <dom-modu ...
- 【胡思乱想】JNI与线程池的维护
JNI中,C/C++代码里创建的资源不由Java GC处理,故这里的资源必须由C/C++代码明确释放.在JNI中,C/C++回调Java的方法是调用一个CallXXMethod函数来实现的,如果回调的 ...