Optional对象

Optional 类是一个可以为null的容器对象,用于简化Java中对空值的判断处理,以防止出现各种空指针异常。

静态方法-of 必须确定对象不为null 在使用of封装成optional对象 否则会报空指针异常

Optional<Author> authorOptional = Optional.of(authors);
authorOptional.ifPresent(author -> System.out.println(author.getName()));

静态方法-ofNullable 不管对象是否为null 只要使用ofNullable封装成optional对象 就会避免空指针

Optional<Author> authorOptional = Optional.ofNullable(authors);
authorOptional.ifPresent(author -> System.out.println(author.getName()));

ifPresent有参数时 执行传入的Consumer方法

Optional<Author> authorOptional = getAuthorOptional();
authorOptional.ifPresent(author -> System.out.println(author.getName()));

isPresent()判断是否是否为空 返回值为boolean类型

Optional<Author> authorOptional = getAuthorOptional();
if(authorOptional.isPresent()){
System.out.println(authorOptional.get().getName());
}

获取值

Optional<Author> authorOptional = getAuthorOptional();

//不推荐使用get 如果使用get会对象为null会抛出异常 throw new NoSuchElementException("No value present");
Author author = authorOptional.get(); //推荐使用 如果对象不为null则展示,如果为null展示自定义的信息
Author author = authorOptional.orElseGet(() -> new Author(2L, "哈哈", 20, "一个帅气的男人", null)); //如果对象不为空则输出对象的值,如果为空则抛出我们指定的异常
Author author = authorOptional.orElseThrow(() -> new RuntimeException("没有值!!!"));

map 数据转换

ptional<Author> authorOptional = getAuthorOptional();
authorOptional.map(author -> author.getBooks())
.ifPresent(books -> System.out.println(books));

filter方法对数据进行过滤。如果原本是有数据的,但是不符合判断,也会变成一个无数据的Optional对象。

Optional<Author> authorOptional = getAuthorOptional();
authorOptional.filter(author -> author.getAge() > 88)
.ifPresent(author -> System.out.println(author.getName()));

测试使用的静态数据

private static Optional<Author> getAuthorOptional(){
Author author = new Author(1L, "蒙多",33,"一个从菜刀中明悟哲理的祖安人" ,null); List<Book> books1 = new ArrayList<>();
books1.add(new Book(1L, "刀的两侧是光明与黑暗", "哲学,爱情",88,"用一把刀划分了爱恨"));
books1.add(new Book(2L,"一个人不能死在同一把刀下","个人成长,爱情" ,99, "讲述如何从失败中明悟真理"));
author.setBooks(books1); return Optional.ofNullable(author);
}
//返回实体对象
private static Author getAuthors(){
Author author = new Author(1L, "蒙多",33,"一个从菜刀中明悟哲理的祖安人" ,null);
return null;
}

测试使用的类

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Book { //id
private long id;
//姓名
private String name;
//年龄
private String category;
//评分
private int score;
//简介
private String intro;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Author implements Comparable<Author> { //id
private Long id;
//姓名
private String name ;
//年龄
private Integer age;
//简介
private String intro;
//作品
private List<Book> books ; //比较排序
@Override
public int compareTo(Author o) {
return o.getAge() - this.getAge();
}
}

Optional对象的更多相关文章

  1. Guava API学习之Optional 判断对象是否为null

    java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了.为了防止抛出这个异常,我们经常会写出这样的代码: Person person = p ...

  2. Guava学习笔记(1):Optional优雅的使用null

    转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...

  3. JAVA 8 Optional类介绍及其源码

    什么是Optional对象 Java 8中所谓的Optional对象,即一个容器对象,该对象可以包含一个null或非null值.如果该值不为null,则调用isPresent()方法将返回true,且 ...

  4. guava学习--Optional可空类型

    转载:http://www.cnblogs.com/whitewolf/p/4231783.html Null sucks 回到本文主题Optional.在我日常编程中NullPointerExcep ...

  5. Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

  6. C++ 中关于optional 使用过程中遇到的问题

    头文件:#include <boost/optional.hpp> using namespace boost; optional很像一个仅能存放一个元素的容器,它实现了"未初始 ...

  7. Java 8——Optional

    本文主要介绍Java 8的 Optional 的简单使用 Address 1 2 3 4 5 6 7 @Data @AllArgsConstructor @NoArgsConstructor publ ...

  8. Java中Optional使用注意事项

    前言 之前遇到过使用Optional之后带来的隐含bug,现在强调记录一下不好的用法,防止错用. Optional不能序列化,不能作为类的字段(field) 这点尤为重要,即类要纯粹.如果是POJO就 ...

  9. Java 中遇到null 和为空的情况,使用Optional来解决。

    Java 中遇到null 和为空的情况,使用Optional来解决 示例代码: package crazy; import java.util.Optional; class Company { pr ...

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

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

随机推荐

  1. 解决报错:axios is not defined

    好家伙,来解决报错:axios is not defined 写前端嘛,修bug,不寒颤 进入页面一片空白 来看看报错: 1.axios在安装时:npm install axios --save-de ...

  2. KingbaseES 数据库删除功能组件

      关键字: KingbaseES.卸载.删除功能   一.安装后检查 在安装完成后,可以通过以下几种方式进行安装正确性验证: 1. 查看安装日志,确认没有错误记录; 2. 查看开始菜单: 查看应用程 ...

  3. 1.关于433MHz按键单片机解码

    近段时间做项目要用到单片机接收433MHz按键发过来的码值,涉及短按.连按.长按,由于之前没有做过这方面一开始有点蒙,找遍网上都没有案例,现在项目完成了整理自己的一些心得和大家分享分享!!!直入主题. ...

  4. winform,隐藏窗体

    public Form1()        {            InitializeComponent();            this.WindowState = FormWindowSt ...

  5. (数据科学学习手札143)为geopandas添加gdb文件写出功能

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,很多读者朋友跟随着我先前写作的 ...

  6. 在图片不被裁剪时opencv绕图片中任意点旋转任意角度

    opencv绕图片中任意角度旋转任意角度   最近在做项目需要把把图片绕图片中任意点旋转任意角度,考虑到自己旋转需要编写插值算法,所以想到了用opencv,但是网上都是围绕图片中点旋转任意角度的,都是 ...

  7. day43-反射02

    2.Class类 2.1基本介绍 Class类也是类,因此也继承Object类 Class类对象不是new出来的,而是系统创建的 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次 每个 ...

  8. 如何使用netlify部署vue应用程序

    什么是Netlify? Netlify是一个现代网站自动化系统,其JAM架构代表了现代网站的发展趋势.所谓JAM,就是指基于客户端JavaScript.可重用API和预构建Markup标记语言的三者结 ...

  9. POJ3237 Tree (树链剖分)

    通过打懒标记实现区间取反,和线段树基本操作都差不多. 本题还是一道边权化为点权的问题. 200行巨长代码: 1 #include<cstdio> 2 #include<cstring ...

  10. 设计模式之观察者模式_C++

    1 // ADBHelper.cpp : This file contains the 'main' function. Program execution begins and ends there ...