Java 8 之 Optional

背景介绍:在我们实际开发中,经常会遇到各种 NullPointerException 报错,为了避免此类问题,需要在业务代码上添加各种if判断,使代码看起来很臃肿,而且很不美观

使用Optional 提供的各种方法,能够很好的解决上述的问题,下面介绍一下Optional的基础API

准备工作:新建一个User类及Address类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User { private String id; private String name; private Address address;
} @NoArgsConstructor
@AllArgsConstructor
@Data
public class Address { private String province; private String city; }

1.orElse

当value为null时,取value1,否则取value

User user = null;
// 1.user为null时
User user1 = new User("001", "user1", null);
User result = Optional.ofNullable(user).orElse(user1);
System.out.println(result); // 输出 User(id=001, name=user1, address=null) // 2.user 不为null时
user = new User("000","user",null);
result = Optional.ofNullable(user).orElse(user1);
System.out.println(result); //输出 User(id=000, name=user, address=null)

2.orElseThrow

当value为null时,抛出参数中指定的异常

User user = null;
// 写法1
User result = Optional.ofNullable(user).orElseThrow(NullPointerException::new);
// 写法2
User result = Optional.ofNullable(user).orElseThrow(()->new Exception("user为空"));

3.orElseGet

如果存在则返回该值,否则调用other值并返回该调用的结果。

User user = null;
User result = Optional.ofNullable(user).orElseGet(()->new User("1111","other",null));
System.out.println(result); // 输出 User(id=1111, name=other, address=null)

4.isPresent

如果存在值,则返回true ,否则返回false

User user = null;
boolean present = Optional.ofNullable(user).isPresent();
System.out.println(present); // false User user1 = new User();
boolean present1 = Optional.ofNullable(user1).isPresent();
System.out.println(present1); // true

5.ifPresent

如果 存在值,则执行定义代码,否则什么也不做。

User user = null;
Optional<User> user1 = Optional.ofNullable(user);
user1.ifPresent(u -> System.out.println(u)); // 什么都不输出 User user = new User();
Optional<User> user1 = Optional.ofNullable(user);
user1.ifPresent(u -> System.out.println(u)); // User(id=null, name=null, address=null)

6.map

如果存在值,则对其应用提供的映射函数,如果结果为非 null,则返回描述结果的Optional 。否则返回一个空的Optional

Address address = new Address("浙江","杭州");
User user = new User();
user.setId("001");
user.setName("ll");
user.setAddress(address); String s = Optional.ofNullable(user)
.map(u -> u.getAddress())
.map(address1 -> address1.getCity())
.orElseThrow(() -> new Exception("111"));
System.out.println(s); // 杭州

7.flatMap

如果存在值,则将提供的Optional函数应用于它,返回该结果,否则返回空Optional 。与map的不同是 flatMap提供的函数必需是Optional的

Address address = new Address("浙江","杭州");
User user = new User();
user.setId("001");
user.setName("ll");
user.setAddress(address)
Optional<String> s1 = Optional.ofNullable(user)
.flatMap(user1 -> Optional.of(user1.getAddress()))
.flatMap(address1 -> Optional.of(address1.getCity()));
System.out.println(s1.orElse("null")); // 杭州

8.filter

对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。

Address address = new Address("浙江","杭州");
User user = new User();
user.setId("001");
user.setName("ll");
user.setAddress(address); String a = Optional.ofNullable(user)
.filter(user1 -> user1.getId().equals("001"))
.map(user1 -> user1.getId())
.orElse("null");
System.out.println(a); // 001 String b = Optional.ofNullable(user)
.filter(user1 -> user1.getId().equals("002"))
.map(user1 -> user1.getId())
.orElse("null");
System.out.println(b); // null

Java 8 之 Optional的更多相关文章

  1. map和flatmap的区别+理解、学习与使用 Java 中的 Optional

    转自:map和flatmap的区别 对于stream,   两者的输入都是stream的每一个元素,map的输出对应一个元素,必然是一个元素(null也是要返回),flatmap是0或者多个元素(为n ...

  2. 理解、学习与使用 Java 中的 Optional

    从 Java 8 引入的一个很有趣的特性是 Optional  类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...

  3. 理解、学习与使用 JAVA 中的 OPTIONAL<转>

    从 Java 8 引入的一个很有趣的特性是 Optional  类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...

  4. 如何更好地使用Java 8的Optional

    Java 8中的Optional<T> 是一个可以包含或不可以包含非空值的容器对象,在 Stream API中很多地方也都使用到了Optional. java中非常讨厌的一点就是nullp ...

  5. Tomcat上java.lang.IllegalStateException: Optional int parameter 'id' is not present

    今日, 本人在tomcat+spring mvc平台的服务器上遇到java.lang.IllegalStateException: Optional int parameter 'id' is not ...

  6. 理解、学习与使用 JAVA 中的 Optional【转载】

    这是一篇转载的文章.刚学java的时候看了好久这个Optional,但一直是懵的.今天又又遇到了,重新回来再看的时候,发现并没有那么难道那个. 转载的文章再开头处写了一个对于理解Optional很关键 ...

  7. JAVA 中的Optional (臭名昭著的空指针异常(NullPointerException))

    从 Java 8 引入的一个很有趣的特性是 Optional  类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...

  8. 理解、学习与使用Java中的Optional

    从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异 ...

  9. Java 8 (9) Optional取代null

    NullPointerException,大家应该都见过.这是Tony Hoare在设计ALGOL W语言时提出的null引用的想法,他的设计初衷是想通过编译器的自动检测机制,确保所有使用引用的地方都 ...

随机推荐

  1. python unittest控制用例的执行顺序

    为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的 ...

  2. 推荐一款仿iPhone桌面的代码. ___王朋.

    Demo:https://files.cnblogs.com/files/sixindev/LxGridView-master.zip 这是作者原来的效果图,很多东西还需要慢慢学习.作者用的很多类,根 ...

  3. Shell条件练习题

    Shell条件练习题 目录 Shell条件练习题 1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限 2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的 ...

  4. Spring Security配置个过滤器也这么卷

    以前胖哥带大家用Spring Security过滤器实现了验证码认证,今天我们来改良一下验证码认证的配置方式,更符合Spring Security的设计风格,也更加内卷. CaptchaAuthent ...

  5. 上架打包错误:error itms-90086

    这是一个很纠结的错误 大家第一反应肯定是 赶紧去看看 位数是否设置  然后发现没有问题  就开始懵逼了 (比如我) 然而无意看到了一个人写的简书 这个人在 Overflow 找到了一个答案 比如你选择 ...

  6. Java中邮件发送session.getDefaultInstance和getInstance的区别

    假设你想要同时用两个邮箱分别给再给两个邮箱发送邮件时,你就需要创建两个java.mail.Session对象,这时候你用getDefaultInstance的话会发现第二个Session对象和第一个对 ...

  7. 中了勒索病毒的win7系统

  8. C# 枚举器(enumerator)

    总结: 1.枚举器就像是序列中的"游标"或"书签".可以有多个"书签",移动其中任何一个都可以枚举集合,与其他枚举器互不影响.用来遍历数据结 ...

  9. 【C#基础概念】常量

    常量的定义 常量是在编译时设置其值并且永远不能更改其值的字段. 使用常量可以为特殊值提供有意义的名称,而不是数字文本 常量是不可变的值,在编译时是已知的,在程序的生命周期内不会改变. 常量使用 con ...

  10. 知识增广的预训练语言模型K-BERT:将知识图谱作为训练语料

    原创作者 | 杨健 论文标题: K-BERT: Enabling Language Representation with Knowledge Graph 收录会议: AAAI 论文链接: https ...