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详细用法的更多相关文章

  1. Java中stream的详细用法

    来自于:Java 8 stream的详细用法_旅行者-CSDN博客_java stream 一.概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行 ...

  2. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  3. 在DOS下的DEBUG命令的详细用法

    在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...

  4. __declspec关键字详细用法

    __declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI ...

  5. CString.Format的详细用法(转)

    CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...

  6. IFRAM的详细用法

    IFRAM的详细用法:   IFRAM的详细用法:  <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...

  7. 【转】java.util.vector中的vector的详细用法

    [转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...

  8. DOM Style样式对象的详细用法

    DOM Style样式对象的详细用法 HTML Style样式比较复杂,相应访问.修改方法也有所差异.参考相关资料,整理如下. 典型Html文件如下,有三种定义方式. <head>     ...

  9. css基础之 font的简写规则 以及 自定义 CSS3 @font-face详细用法

    Part 1 font简写 CSS的命名规则是用英文字母 数字 和下划线(一般用小写)来命名.简写css font的好处有三:一是写起来方便(就像键盘快捷键):二是简化代码:三是帮助你熟悉和深刻理解c ...

  10. Tomcat详细用法学习(三)

    本篇接上一篇<Tomcat详细用法学习(二)>,主要讲解服务器所要求的web应用的组织结构. 上一篇说到了如何使用服务器将自己的web应用映射成虚拟目录,以便于在浏览器中可以对自己开发的w ...

随机推荐

  1. idea测试类没有运行按钮,右键没有Run、Debug

    问题 原因 编写测试类错误 解决办法 选择合适的路径

  2. 海上液化天然气 LNG 终端 | 图扑数字孪生

    关于 LNG 液化天然气 (Liquefied Natural Gas,简称 LNG) 在能源转型过程中被广泛认可为相对较清洁的能源选择. 相对于传统的煤炭和石油燃料,LNG 的燃烧过程产生的二氧化碳 ...

  3. java文件读取 while ((len = reader.read(buffer)) != -1){}的理解

    源文件 InputStreamReader reader=new InputStreamReader(new FileInputStream(file),"UTF-8"); //读 ...

  4. NVIDIA RTX4090,你能用它做什么?

    都说男生是世界上最简单的动物,为什么呢?举个例子,你要给女朋友送礼,你可以选择包.口红.护肤品.化妆品等,而包的品牌和样式.口红的色号等足以让你挑得眼花缭乱.而男生不一样,如果女生选择给男生送礼,我相 ...

  5. 使用SPEL自定义表达式

    自定义表达式 Spring提供了一个可以自定义表达式的接口 package com.qbb.qmall.item; import org.junit.Test; import org.springfr ...

  6. LeetCode 503:下一个更大的元素|| (单调栈 or 线段树)

    解题思路: 1.单调栈:因为是循环数组,因此把数组复制三遍,ans 数组复制为2倍长,维护一个单调非递增的栈,栈保存的元素是元组(a[i] , i ),如果后面的值有比栈顶元素的值大,栈顶元素出栈,更 ...

  7. 深入理解 Docker 核心原理:Namespace、Cgroups 和 Rootfs

    通过这篇文章你可以了解到 Docker 容器的核心实现原理,包括 Namespace.Cgroups.Rootfs 等三个核心功能. 如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎 ...

  8. Web测试基本思路:UI测试、功能测试和兼容性测试

    关于网站测试的基本思路,希望对测试小白有所帮助. 一.UI测试 用户界面测试主要是拿待测网页和设计稿进行对比,主要主要以下4点: 1.注重细节: 这点最基本,就是对比是细心.细心再细心. 2.主要整体 ...

  9. 一文了解 Kubernetes

    一文了解 Kubernetes 简介:Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了.这时候就需要我们的主角 Kubernetes 上场了,先来了解一下 Kubernetes ...

  10. HDU 4705 立方和拆解

    HDU 4705 立方和拆解 题意 给一棵树,找出所有的(A,B,C)三元组的数量,满足ABC不能同时被一条路径覆盖 思路 首先可以明确的是,对于每个入度大于等于3的点(也就是有两个或以上儿子的节点) ...