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. Codeforces Round 905 (Div. 3)

    Codeforces Round 905 (Div. 3) A. Morning 题意:操作:显示,向前走都为一次操作:目标:显示这四个数 思路:0->10,然后依次作差就行 #include ...

  2. Vue-cli脚手架下载安装

    注意:在下载安装该脚手架之前先安装配置好NodeJS以及镜像源,NodeJS详情可查询文章:NodeJS下载安装 1.cmd中输入以下指令: npm install -g @vue/cli 整个过程中 ...

  3. 【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF

    [MRCTF2020]Ezpop_Revenge--PHP原生类SSRF 1. 收获 CMS初审计 google.baidu hack PHP原生类反序列化 2. 看题 2.1 读源码 网页存在源码泄 ...

  4. C++ Qt开发:字符串QString容器

    在Qt框架中,QString 是一个强大而灵活的字符串容器,专为处理 Unicode 字符而设计.它提供了许多方便的方法来操作和处理字符串,使得在跨平台开发中能够轻松地进行文本操作.QString 是 ...

  5. SpringCore 完整学习教程1,入门级别

    1. SpringApplication SpringApplication类提供了一种方便的方式来引导从main()方法启动的Spring应用程序.在很多情况下,你可以委托给静态的SpringApp ...

  6. macOS 苹果电脑双面打印单面打印PDF设置

    苹果的打印服务分为两个部分,一个是应用层另一个是系统层. 其中双面打印或单面打印统一在系统层面设置,下面我分别截图示意wps pdf和福昕pdf两款软件设置双面打印. 1.WPS PDF 在完成方式中 ...

  7. VMware安装虚拟机详细步骤

    在VMware中安装CentOS7 01.目录 CentOS7的下载 CentOS7的配置 CentOS7的安装 CentOS7的网络配置 自动获取IP 固定获取IP 02.安装前提 准备工作: 提前 ...

  8. pinia持久化存储插件-pinia-plugin-persistedstate

    pinia-plugin-persistedstate 丰富的功能可以使 Pinia Store 的持久化更易配置: 与 vuex-persistedstate 相似的 API 所有 Store 均可 ...

  9. 使用create-vue创建vue3项目

    create-vue是vue3新的脚手架搭建项目工具,底层构建工具使用vite,而不是vue-cli的webpack. 但不是说你不能用以前的vue create命令来创建vue3项目,你完全可以用v ...

  10. JavaScript forEach 方法跳出循环

    for循环 JavaScript中,for循环可以使用 break 和 continue 来跳出: continue:跳出本次循环 break:结束循环 for (let i = 0; i < ...