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 ...
随机推荐
- 环形缓冲区 Ring Buffer 的实现
环形缓冲区(Circular Buffer 或 Ring Buffer)是一种数据结构,它在逻辑上形成一个闭环.这种结构非常适用于需要固定大小的缓冲区的情况,如音频处理.网络通信.实时数据传输等.环形 ...
- 关于mac电脑突然搜不到家里wifi但手机却能连上的问题解决
今天用mac电脑时,突然遇到一个奇怪的问题,家里wifi用的好好的,突然就连不上了,在看电脑能搜索到的wifi,居然家里的wifi都没有搜索到,但自己的手机却是正常的,然后我再看看我另外一台windo ...
- Win10操作系统安装Python
1 Python解释器下载 1.1 安装环境 Windows 10 专业工作站版22H2 python-3.9.6-amd64.exe 1.2 下载地址 Python官网:https://www.py ...
- .NET Conf 2023 Chengdu - 成都站圆满结束!
今年的.NET Conf 2023,中国区首次有两个会场举办Local Event,成都会场已于上周六12月9日圆满结束. 本次成都会场共计100+余名.NET开发者报名参与,共计10+名志愿者参与筹 ...
- 解决报错:Java 8 date/time type `java.time.Duration` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
1.错误信息: Java 8 date/time type java.time.Duration not supported by default: add Module "com.fast ...
- 汽车制造业PMC组态应用最佳实践
01 案例及行业介绍 汽车制造工业是我国国民经济的重要支柱产业,汽车制造工厂一般包含冲压.焊装.涂装.总装四大车间.每辆汽车的生产过程被分解成很多加工任务下发给各个车间进行完成.车辆从冲压车间开始到总 ...
- 【UniApp】-uni-app-打包成小程序
前言 大家好,我是 BNTang, 在上一节文章中,我给大家详细的介绍了如何将我开发好的项目打包为网页. 趁热打铁,在来一篇文章,给大家详细的介绍如何将项目打包为小程序. 正文 打开微信小程序呢,其实 ...
- Windows和Linux下通过go实现自删除
自删除在攻防中都挺常见的,自写远控通常也有需要.可是在度娘里搜不到什么办法,于是就查查Windows api学习记录一回. linux 先获得当前程序的文件名,再使用syscall这个包中的Unlin ...
- linux内核initcall放置在各个section中函数执行流程
前言 linux以及嵌入式一些代码,我们看到core_initcall.device_initcall等等需要链接器分配各个section,并且在启动该模块时候执行.下面我们详细追溯一下执行过程. 作 ...
- Programming abstractions in C阅读笔记:p184-p195
<Programming Abstractions In C>学习第61天,p184-p195总结. 一.技术总结 1.mutual recursion 2.natural number ...