Optional详细用法
package com.example.apidemo.jdk8; import com.example.apidemo.vo.UserInfo;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import lombok.Data;
import org.junit.Test; /**
* @Author Tim
* @Date 2022/5/19 10:54
*/
public class TestOptional { /**
* Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
* Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。
* Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
* Optional 类的引入很好的解决空指针异常。
*/
@Test
public void test() throws Exception {
String s = "2";
String value = Optional.ofNullable(s).orElse("ab");
System.out.println("Test=="+ value + "|" + value.length()); //创建一个Optional容器对象
Optional<String> optional = Optional.of("XiaoMing"); //为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。Optional有值就返回,没有抛出NoSuchElementException
Optional<Object> o1 = Optional.ofNullable(null);
//System.out.println(o1.get()); //orElse:如果有值则将其返回,否则返回指定的其它值
System.out.println(o1.orElse("输出orElse")); //orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
UserInfo userInfo = null;
UserInfo u1 = Optional.ofNullable(userInfo).orElse(createNew());
System.out.println(u1);
UserInfo u2 = Optional.ofNullable(userInfo).orElseGet(()->createNew());
System.out.println(u2);
System.out.println("----------------------------------"); //map:如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
String s1 = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
System.out.println("s1=="+s1); //输出: XIAOMING //flatMap:如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。与map不同的是,
// flatMap 的返回值必须是Optional,而map的返回值可以是任意的类型T
Optional<String> s2 = optional.flatMap(e -> Optional.of(e.toUpperCase()));
System.out.println("s2=="+s2.get()); //输出:XIAOMING //filter
List<String> strings = Arrays.asList("rmb", "doller", "ou");
for (String str : strings) {
String op = Optional.of(str).filter(g -> g.contains("o")).orElse("没有--包含o的");
System.out.println(op);
}
} //createNew
private static UserInfo createNew() {
return new UserInfo("用户", 50, BigDecimal.ZERO, BigDecimal.ZERO);
} }
package com.example.apidemo.jdk8; import java.util.Optional;
import lombok.Data;
import org.junit.Test; /**
* @Author Tim
* @Date 2022/5/19 10:54
*/
public class TestOptional2 { /**
* 3种真实场景下的测试案例
*/
@Test
public void test() throws Exception {
//用法案例1:
System.out.println(getCity(new User()));
System.out.println(getCity2(new User())); //用法案例2:
System.out.println(getDefaultUser(new User()));
System.out.println(getDefaultUser2(new User())); //用法案例3: Optional取值,如果不存在则调用一个没返回值得方法
Optional.ofNullable(new User()).ifPresent(u-> dosomething(u));
// if(user != null){
// dosomething(user);
// }
} private void dosomething(User u) {} //1.旧写法(循环每一层判断下面是否有值)
public String getCity(User user) throws Exception{
try {
if(user!=null){
if(user.getAddress()!=null){
Address address = user.getAddress();
if(address.getCity()!=null){
return address.getCity();
}
}
}
} catch (Exception e) {
throw new Exception("取值错误1");
}
return "取值错误1";
} //1.新写法(用map去匹配)
public String getCity2(User user) throws Exception{
return Optional.ofNullable(user)
.map(u-> u.getAddress())
.map(a->a.getCity())
.orElse("取值错误2");
} //2. 以前写法 (获取指定的用户返回,没有就用默认的)
public User getDefaultUser(User user) throws Exception{
if(user!=null){
String name = user.getName();
if("zhangsan".equals(name)){
return user;
}
return null;
}else{
user = new User();
user.setName("zhangsan");
return user;
}
} //2. java8写法
public User getDefaultUser2(User user) {
return Optional.ofNullable(user)
.filter(u->"zhangsan2".equals(u.getName()))
.orElseGet(()-> {
User user1 = new User();
user1.setName("zhangsan2");
return user1;
});
} @Data
public static class User {
String name;
Address address;
} @Data
public static class Address {
String city;
} }
Optional详细用法的更多相关文章
- Java中stream的详细用法
来自于:Java 8 stream的详细用法_旅行者-CSDN博客_java stream 一.概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行 ...
- C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法
C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...
- 在DOS下的DEBUG命令的详细用法
在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...
- __declspec关键字详细用法
__declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI ...
- CString.Format的详细用法(转)
CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...
- IFRAM的详细用法
IFRAM的详细用法: IFRAM的详细用法: <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...
- 【转】java.util.vector中的vector的详细用法
[转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...
- DOM Style样式对象的详细用法
DOM Style样式对象的详细用法 HTML Style样式比较复杂,相应访问.修改方法也有所差异.参考相关资料,整理如下. 典型Html文件如下,有三种定义方式. <head> ...
- css基础之 font的简写规则 以及 自定义 CSS3 @font-face详细用法
Part 1 font简写 CSS的命名规则是用英文字母 数字 和下划线(一般用小写)来命名.简写css font的好处有三:一是写起来方便(就像键盘快捷键):二是简化代码:三是帮助你熟悉和深刻理解c ...
- Tomcat详细用法学习(三)
本篇接上一篇<Tomcat详细用法学习(二)>,主要讲解服务器所要求的web应用的组织结构. 上一篇说到了如何使用服务器将自己的web应用映射成虚拟目录,以便于在浏览器中可以对自己开发的w ...
随机推荐
- java String字符串总结
这里我们将总结字符串相关的知识,除了总结String的API用法,同时我们还会总结一些相关的知识点,包括字符串常量池.StringBuffer.StringBuilder,以及equals和==的用法 ...
- jdk9模块化
JDK 9是Java开发语言的一个重大版本.其中最令人兴奋的新特性之一是模块化系统.模块化系统提出了一种新的代码组织方式,它可以帮助开发人员更好地组织和管理代码,从而使Java应用程序更加可维护.可扩 ...
- 如何将 performance_schema 中的 TIMER 字段转换为日期时间
问题 最近有好几个朋友问,如何将 performance_schema.events_statements_xxx 中的 TIMER 字段(主要是TIMER_START和TIMER_END)转换为日期 ...
- 使用CEF(七)详解macOS下基于CEF的多进程应用程序CMake项目搭建
由于macOS下的应用程序结构导致了CEF这样的多进程架构程序在项目结构.运行架构上有很多细节需要关注,这一块的内容比起Windows要复杂的多,所以本文将会聚焦macOS下基于CEF的多进程应用架构 ...
- 解决win10的wifi打不开或无法搜索到周围wifi的问题
今天笔者遇到了一个比较奇葩的问题,就是笔记本电脑的wifi打不开了,即使打开了也是搜索不到周围的wifi的.这个问题一开始笔者没有发现,因为在暑假期间都是使用笔记本连接自己的手机热点进行上网的.然而暑 ...
- Tensorflow2.0:使用Keras自定义网络实战
tensorflow2.0建议使用tf.keras作为构建神经网络的高级API 接下来我就使用tensorflow实现VGG16去训练数据 背景介绍: 2012年 AlexNet 在 ImageNet ...
- 玩转Spring状态机
说起Spring状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring状态机就是状态模式的一种实现,在介绍Spring状态机之前,让我们来看看设计模式中的状态模式. 1 ...
- jextract的使用
写这个博客的目的:新人去看jextract的官网是看不懂的,就算看懂了也不会使用,一头雾水,我会从0开始教如何使用,如何搭配java去调用c函数. 首先我们得了解jextract是什么,官网的解释是一 ...
- 韩国国民搜索 NAVER:为 AI 平台引入存储方案 JuiceFS
NAVER 是一家多元化的互联网公司,拥有韩国最大的搜索引擎并在人工智能.自动驾驶等高科技领域积极投入. 在搭建 AI 平台时,NAVER 评估了公有云平台的存储产品.Alluxio 以及高性能专用存 ...
- markdown中插入视频前台渲染出来导致<video>等标签被转义成字符
markdown中插入视频前台渲染出来导致<video>等标签被转义成字符解决办法: 如图: 在markdown里面插入视频,可以按照下面写法,哈哈,虽然很捞,但是还是可以满足的. < ...