服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java关于JDK1.8中的Optional类

Java关于JDK1.8中的Optional类

2021-12-18 13:31码农飞哥 Java教程

本文主要介绍了Optional类的一些常用方法,以及其应用场景,其主要是为了规避空指针异常(NPE)。熟练的运用Optional类可以很大的简化我们的代码,使代码简洁明了。,需要的朋友可以参考下面文章内容

Java关于JDK1.8中的Optional类

一、定义

Optional是一个容器,它可以保存类型T的值,或者仅仅保存null,Optional类主要是用来避免空指针异常(NPE),其提供的一系列的方法配合Lambda表达式可以让代码更加清晰,语义化,以及避免了空指针异常的问题,这里要注意是避免空指针异常,而不是避免返回null。

二、Optional方法的使用

1、empty 方法

empty 方法返回一个不包含值的Optional实例,注意不保证返回的empty是单例,不要用==比较。

public static<T> Optional<T> empty()

2、of 方法返

of 方法返回一个Optional实例,传入的值必须是非空值,传入null会抛出空指针异常。

public static <T> Optional<T> of(T value)

3、返回一个Optional实例

如果传入值非空,则实例中包含非空值,如果传入null,返回不包含值的empty

public static <T> Optional<T> ofNullable(T value)

4、isPresent 方法

用来判断实例是否包含值,如果不包含非空值返回false,否则返回true

public boolean isPresent();

5、get方法

如果实例包含值则返回当前值,否则抛出NoSushElementException 异常.

public T get();

不推荐调用上面两个方法,因为容易写出如下代码,比原先判断if null的代码还要脏

?
1
2
3
4
5
6
7
public static String getUserName1(User user) {
     Optional<User> user1 = Optional.ofNullable(user);
     if (!user1.isPresent()) {
         return "参数为空";
     }
     return user1.get().getName();
 }

下面是用if-null

?
1
2
3
4
5
6
public static String getUserName(User user) {
      if (user == null) {
          return "参数为空";
      }
      return user.getName();
  }

6、ifPresent

(Consumer consumer):如果option对象保存的值不是null,则调用consumer对象,否则不调用

 public void ifPresent(Consumer<? super T> consumer);

代码示例:

?
1
2
3
4
5
6
Optional<Integer> optional1 = Optional.ofNullable(1);
     Optional<Object> optional2 = Optional.ofNullable(null);
  //如果不是null,调用Consumer
     optional1.ifPresent(t -> System.out.println("value is" + t));   //value is1
     //如果是null,不调用Consumer
     optional2.ifPresent(t -> System.out.println("value is " + t));  

如上代码,输出结果是 第一条 语句输出value is1,第二条语句没有输出

 7、filter方法

 如果值存在,并且这个值匹配给定的predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional

Optional<T> filter(Predicate<? super <T> predicate)

代码示例:

?
1
2
3
4
5
6
7
8
9
Optional<Integer> optional1 = Optional.ofNullable(1);
     Optional<Object> optional2 = Optional.ofNullable(null);
     Optional<Integer> filter1 = optional1.filter(a -> a == null);
      Optional<Integer> filter2 = optional1.filter((a) -> a == 1);
      Optional<Object> filter3 = optional2.filter(a -> a == null);
 
  System.out.println(filter1.isPresent()); //false
      System.out.println(filter2.isPresent()); //true
      System.out.println(filter2.get().intValue() == 1); //true

如上代码,演示了filter方法如何使用,输出结果如代码注释所示。

8、 map(Function)

对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)

 public<U> Optional<U> map(Function<? super T, ? extends U> mapper);

代码示例:输出结果已经写在注释中。

?
1
2
3
4
5
6
Optional<Integer> optional1 = Optional.ofNullable(1);
      Optional<Object> optional2 = Optional.ofNullable(null);
Optional<String> str1Optional = optional1.map(a -> "key" + a);
      Optional<String> str2Optional = optional2.map(a -> "key" + a);
      System.out.println(str1Optional.get()); //key1
      System.out.println(str2Optional.isPresent()); //false

9、flatMap()

功能与map()相似,差别在返回值不同,flatMap方法的mapping函数返回值可以是任何类型T,而map方法的mapping函数必须是Optional

 public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper);

代码示例:

?
1
2
3
4
5
6
Optional<Integer> optional1 = Optional.ofNullable(1);
      Optional<Object> optional2 = Optional.ofNullable(null);
     Optional<Optional<String>> str11Optional = optional1.map(a -> Optional.of("key" + a));
      Optional<String> str22Optional = optional1.flatMap(a -> Optional.of("key" + a));
      System.out.println(str11Optional.get().get()); //key1
      System.out.println(str22Optional.get()); //key1

10、orElse方法

如果optional对象保存的值不是null,则返回原来的值,否则返回value。

public T orElse(T other);

代码示例:

?
1
2
3
4
    Optional<Integer> optional1 = Optional.ofNullable(1);
    Optional<Object> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElse(1000) == 1); //true
    System.out.println((Integer) optional2.orElse(1000) == 1000);//true

11、orElseGet(Supplier supplier)

功能与orElse一样,只不过orElseGet参数是一个对象。
 

public T orElseGet(Supplier<? extends T> other);

代码示例:

?
1
2
3
4
    Optional<Integer> optional1 = Optional.ofNullable(1);
     Optional<Object> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElseGet(() -> 1000) == 1); //true
     System.out.println((Integer) optional2.orElseGet(() -> 1000) == 1000); //true

12、orElseThrow方法

值不存在则调用传入的Supplier参数,生成一个异常实例并抛出,这个方法通常与全局异常处理器一起使用,当参数或者其他情况获取不到值是,抛出自定义异常,由异常处理器处理成通用返回结果。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier);

代码示例:

?
1
2
3
4
5
6
7
8
9
10
optional1.orElseThrow(() -> {
     throw new IllegalStateException();
 });
 try {
     optional2.orElseThrow(() -> {
         throw new IllegalStateException();
     });
 } catch (IllegalStateException e) {
     e.printStackTrace();
 }

三、实战参考

假设我们要解析一段json字符串,按照传统的if-null方式我们需要做如下处理:为了获取CUid的值,我们必须要判断三次。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public static String getOrgUid(String orgResult) {
       if (StringUtils.isBlank(orgResult)) {
           return null;
       }
       JSONObject jsonObject = JSON.parseObject(orgResult);
       if (jsonObject == null) {
           return null;
       }
       if ("success".equals(jsonObject.getString("result"))) {
           return jsonObject.getString("CUid");
       }
       return null;
   }

而运用了我们的Optional类之后,我们可以通过函数式变成来实现。

?
1
2
3
4
5
6
7
8
9
10
11
public static String getNewUid(String orgResult) {
       String orElse = Optional.ofNullable(orgResult)
               .map(n -> JSONObject.parseObject(n))
               .map(a -> {
                   if ("success".equals(a.getString("result"))) {
                       return a.getString("CUid");
                   }
                   return null;
               }).orElse(null);
       return orElse;
   }

运用了函数式变成,我们只需要三段3段代码就能轻松的驾驭,代码简洁明了。

到此这篇关于Java关于JDK1.8中的Optional类的文章就介绍到这了,更多相关Java的Optional类内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://feige.blog.csdn.net/article/details/104385258

延伸 · 阅读

精彩推荐
  • Java教程修改maven本地仓库路径的方法

    修改maven本地仓库路径的方法

    本篇文章主要介绍了修改maven本地仓库路径的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    低至一折起12172021-03-05
  • Java教程详解MongoDB和Spring整合的实例代码

    详解MongoDB和Spring整合的实例代码

    这篇文章主要介绍了详解MongoDB和Spring整合的实例代码,Spring提供了MongoTemplate这样一个模板类的实现方法,简化了具体操作。有兴趣的可以了解一下...

    孔垂云2002020-11-30
  • Java教程java使用泛型实现栈结构示例分享

    java使用泛型实现栈结构示例分享

    泛型是Java SE5.0的重要特性,使用泛型编程可以使代码获得最大的重用。由于在使用泛型时要指明泛型的具体类型,这样就避免了类型转换。本实例将使用泛...

    java技术网3682019-11-12
  • Java教程JAVA实现简单停车场系统代码

    JAVA实现简单停车场系统代码

    JAVA项目中正号需要一个停车收费系统,就整理出来java实现的一个简单的停车收费系统给大家分享一下,希望对大家有所帮助...

    SHENGLI_5094802020-09-09
  • Java教程gradle中的增量构建浅析

    gradle中的增量构建浅析

    这篇文章主要介绍了gradle中的增量构建,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    flydean程序那些事9892021-08-09
  • Java教程Java之Zookeeper注册中心原理剖析

    Java之Zookeeper注册中心原理剖析

    这篇文章主要介绍了Java之Zookeeper注册中心原理剖析,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    java构架师7042021-10-29
  • Java教程java实现简易局域网聊天功能

    java实现简易局域网聊天功能

    这篇文章主要为大家详细介绍了java实现简易局域网聊天功能,使用UDP模式编写一个聊天程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xouou_533205762021-04-20
  • Java教程Java程序开发中abstract 和 interface的区别详解

    Java程序开发中abstract 和 interface的区别详解

    abstract class和interface在Java语言中都是用来进行抽象类。但是两者有什么区别呢,接下来小编给大家带来了abstract 和 interface的区别详解,感兴趣的朋友一起学...

    士多啤梨苹果橙4052020-05-21