上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional

Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。

1、of

为非null的值创建一个Optional,如果值为null,则会抛出NullPointerException

Optional<Integer> optional = Optional.of(13);
System.out.println(optional)

2、ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。

Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);

3、isPresent

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

Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
System.out.println(optional2.isPresent());

optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());

4、get

如果Optional有值则将其返回,否则抛出NoSuchElementException。

optional2 = Optional.ofNullable("aaa");
System.out.println(optional2);
System.out.println(optional2.isPresent());
System.out.println(optional2.get());

5、ifPresent  

如果Optional实例有值则为其调用consumer,否则不做处理 。隐士地其中进行了null判断。

public static void main(String[] args) {
   String str1 = "hello";
   String str2 = null;
   Optional<String> optional1 = Optional.ofNullable(str1);
   Optional<String> optional2 = Optional.ofNullable(str2);

   optional1.ifPresent(str->System.out.println(str.length()));
   optional2.ifPresent(str-> System.out.println(str.length()));
}

6、orElse

如果有值则将其返回,否则返回指定的其它值。

public static void main(String[] args) {
   String str1 = "hello";
   String str2 = null;
   Optional<String> optional1 = Optional.ofNullable(str1);
   Optional<String> optional2 = Optional.ofNullable(str2);
   System.out.println(optional1.orElse("默认字符串"));
   System.out.println(optional2.orElse("默认字符串"));
}

7、orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的一个值作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值

public static void main(String[] args) {
   Integer i = 20;
   Optional<Integer> op = Optional.ofNullable(i);
   System.out.println(op.orElseGet(()->0));
   System.out.println(Optional.ofNullable(null).orElseGet(()->0));
}

8、orElseThrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

public static void main(String[] args) {
   // 自己指定异常
   System.out.println((Optional.ofNullable("a").orElseThrow(()->new IndexOutOfBoundsException())));
   System.out.println((Optional.ofNullable(null).orElseThrow(()->new IndexOutOfBoundsException())));
}

9、map

map处理有值的情况,如果有值,则对其执行调用map参数中的函数得到返回值,否则返回空Optional。

public static void main(String[] args) {
  List<String> list = new ArrayList<String>(){
      {
           add("aaa");
           add("bbb");
           add(null);
      }
  };

  list.stream().forEach(temp ->{
       Optional<String> opt = Optional.ofNullable(temp);
       System.out.println(opt.map(n -> {
          return n.toUpperCase();
      }).orElse("Nothing"));
  });

  // 简写为如下形式
   list.stream().forEach(temp->{
       System.out.println(Optional.ofNullable(temp).map(n->n.toUpperCase()).orElse("Nothing"));
  });
}

10、flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。 可以将内容

public static void main(String[] args) {
   Optional<String> opt1 = Optional.ofNullable("aaa");
   Optional<String> opt2 = Optional.ofNullable(null);
   System.out.println(opt1.flatMap(n->{
       return Optional.ofNullable(n.toUpperCase());
  }).orElse("还会没有吗"));

   System.out.println( opt2.flatMap(n->{
       return Optional.ofNullable(n.toUpperCase());
  }).orElse("还会没有吗"));
}

11、filter

如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。

public static void main(String[] args) {
   Optional<String> opt1 = Optional.ofNullable("aabbbbaa");
   Optional<String> opt2 = Optional.ofNullable(null);

   System.out.println(opt1.filter(value->value.length()>6));
   System.out.println(opt2.filter(value->value.length()>6));
}

好了,Java8新特性之Optional就介绍到这里了,接下去小乐将会继续带大家了解Java8新特性,请继续关注,转载请说明出处和作者。

乐字节-Java8新特性之Optional的更多相关文章

  1. 乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  2. 乐字节-Java8新特性之Base64和重复注解与类型注解

    上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...

  3. 乐字节-Java8新特性之Date API

    上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...

  4. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

  5. 乐字节-Java8新特性之方法引用

    上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...

  6. 乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  7. 乐字节-Java8新特性之函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  8. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  9. 乐字节Java8核心特性之Optional类

    大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...

随机推荐

  1. XAML 调试工具 不见了?

    XAML调试工具不见了怎么办? 1.调试---> 选项---> 选中 启用XAML的UI调试工具 2.调试---> 选项---> 禁用 使用托管兼容模式 欧了!

  2. Python 爬虫(二十五) Cookie的处理--cookielib库的使用

    Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持. 该模块主要功能是提供可存储cookie的对象.使用此模块捕获cookie并 ...

  3. [学习笔记]K-D Tree

    以前其实学过的但是不会拍扁重构--所以这几天学了一下 \(K-D\ Tree\) 的正确打开姿势. \(K\) 维 \(K-D\ Tree\) 的单次操作最坏时间复杂度为 \(O(k\times n^ ...

  4. spring boot实现异步调用

    今天在这里学习下使用springboot的异步调用async 首先使用@EnableAsync开启异步功能 /** * @author fengzp * @date 17/5/8 * @email f ...

  5. GoLang学习之Golang数组

    Go语言数组 数组是Go语言编程中最常用的数据结构之一.顾名思义,数组就是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素( element),一个数组包含的元素个数被称为数组的长度.需 ...

  6. [JavaScript] 的异步编程之手写一个Gernerator的例子

    <html> <head> <meta charset="UTF-8"> <title>Generator Demo</tit ...

  7. Shell - 简明Shell入门02 - 变量(Variable)

    示例脚本及注释 #!/bin/bash v1=test-variable_123 # 全局变量 v2=12345 v3='This is a test!' # 赋值语句使用单引号或双引号可以包含空格 ...

  8. 机器学习基石笔记:16 Three Learning Principles

    三个理论上界: 三个线性模型: 三个关键工具: 三条学习规则: 1.奥卡姆剃刀定律 先从简单模型开始, 训练后出现欠拟合, 再尝试复杂点模型. 2.采样误差 训练.验证.测试数据尽量同分布. 3.数据 ...

  9. 基于Django+celery二次开发动态配置定时任务 ( 一 )

    需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...

  10. (转) JVM Crash with SIGSEGV - problematic frame - libzip.so

    原文:https://stackoverflow.com/questions/38057362/jvm-crash-with-sigsegv-problematic-frame-libzip-so h ...