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. 安全测试工具Burpsuit和OWASP ZAP使用入门指南

    Burpsuit使用入门指南 安装: 网上有很多相关相关保姆级别教程,所以这里不加赘述了 尽量使用java8版本,破解版兼容8做的比较好 如果发现注册机无法打开或者能打开注册机[run]无法点击唤起软 ...

  2. IDEA配置自定义标签,实现高亮注释~

    为什么要写这么一篇博客呢? 不知道大家有没有这样的一种苦恼,就是在写代码的时候遇到复杂的核心的代码,想加一个特殊的注释方便后期自己或者同事查看,但是这玩意IDEA好像只给我们提供了两个 FIXME : ...

  3. ClickHouse(18)ClickHouse集成ODBC表引擎详细解析

    目录 创建表 用法示例 资料分享 参考文章 ODBC集成表引擎使得ClickHouse可以通过ODBC方式连接到外部数据库. 为了安全地实现 ODBC 连接,ClickHouse 使用了一个独立程序 ...

  4. bash shell笔记整理——head命令

    作用 我直接搬运官方英文了,这英文真的简单直白了,我英语辣鸡...毕竟我学历不行,觉得翻译不好就直接自己来吧.. Print the first 10 lines of each FILE to st ...

  5. 3D网站LOGO动画

    相关技术和实现分析 3D模型 帧动画 threejs 推荐用blender创建3d模型,k帧实现从上到下翻转的帧动画 threejs 中执行帧动画,并关联滚动条 threejs 模型材质 Blende ...

  6. 启动android项目时报dx.jar错误的解决方案

    启动android项目时遇到如下错误: Failed to load E:\SDK\android-sdk-windows\build-tools\27.0.2\lib\dx.jar 原因: 自动使用 ...

  7. cache操作:clean、invalidate与flush的含义

    前言 本文试图搞清楚cache几个操作:clean.invalidate与flush的含义.由于只用过ARM和RISC-V,所以是从ARM和RISC-V的角度来说明. cache line cache ...

  8. STM32CubeMX教程3 GPIO输入 - 按键响应

    1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...

  9. DevOps常用工具全家桶,实现高效运维和交付

    DevOps常用工具全家桶,实现高效运维和交付 1.DevOps发展 DevOps发展背景: 随着互联网技术的快速发展,软件开发和运维的挑战也日益增加.传统的软件开发和运维模式往往存在分离.效率低下. ...

  10. 2021-01-04:mysql里的innodb引擎的数据结构,你有看过吗?

    福哥答案2021-01-04: 面试官刚开始问我看过mysql源码没,然后问了这个问题.回答B+树,过不了面试官那关. 答案来自<MySQL技术内幕 InnoDB存储引擎 第2版>第四章, ...