Optional类使用

Optional简介

java 用来处理 .NPE 提供的类

内部方法

  1. Optional.of(): 当对象为null时, 创建过程会抛出NPE异常

  2. Optional.ofNullable(): 当对象为null时, 也能正常返回Optional对象

  3. Optional.isPrent(): 对象有值 返回true, 为null 返回false

  4. Optional.ifPresent({…}): 当 op不为null, 执行内部方法

  5. Optional.get(): 取出原值, 如果原值为null 会抛出异常, orElse 取出原值, 原值为null赋值默认值

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Optional;

/**
 * @description: 对象容器测试
 * @author: xxx
 * @date: 2022/11/29 14:27
 */
public class OptionalTest {

  public static void main(String[] args) {
    Object object1 = new Object();
    Object object2 = null;

    // Optional.of() 当对象为null时, 创建过程会抛出NPE异常
    Optional<Object> optional1 = Optional.of(object1);
    // Optional<Object> optional2 = Optional.of(object2);

    // Optional.ofNullable() 当对象为null时, 也能正常返回Optional对象
    Optional<Object> optional3 = Optional.ofNullable(object1);
    Optional<Object> optional4 = Optional.ofNullable(object2);

    System.out.println("-------------------------------------------------");

    // Optional.isPrent() 对象有值 返回true, 为null 返回false
    System.out.println("optional3: " + optional3.isPresent());
    System.out.println("optional4: " + optional4.isPresent());

    Integer i1 = 123;
    Optional<Integer> op1 = Optional.ofNullable(i1);
    System.out.println(op1.isPresent());
    // op.ifPresent({..}) 当 op不为null, 执行内部方法
    op1.ifPresent(i -> {
      System.out.println("op1不为null执行");
      System.out.println(i);
    });
    optional4.ifPresent(i -> {
      System.out.println("optional4为null不执行");
      System.out.println(i);
    });

    // 取值逻辑 get: 取出原值, 如果原值为null 会抛出异常, orElse 取出原值, 原值为null赋值默认值
    System.out.println("\n-------------------------------------");
    Integer integer = op1.get();
    System.out.println("op1: " + integer);
    System.out.println("op1: "+ op1.orElse(234));

    // Object obj = optional4.get();
    // System.out.println("obj: " + obj);

    Object obj = optional4.orElse("321");
    System.out.println("op2: "+ obj);

    // orElseGet 取出原值, 原值为null 返回默认值, 内部可以做一些其他处理逻辑
    Integer integer1 = op1.orElseGet(() -> {
      System.out.println("------值为null处理逻辑, 并返回一个默认值给null的值-----");
      return 999;
    });
    System.out.println("op1: " + integer1);

    Object obj2 = optional4.orElseGet(() -> {
      System.out.println("------值为null处理逻辑, 并返回一个默认值给null的值-----");
      return "ni hao!";
    });
    System.out.println("op2: " + obj2);

    System.out.println("\n -----------------------------------------------");
    op1.orElseThrow(RuntimeException::new);
    // optional4.orElseThrow(() -> new RuntimeException("值为null抛出异常"));

    System.out.println("------------测试 op.map() 和 flatMap()-----------");
    // map 返回的对象会被封装为 Optional
    Integer length = Optional.of(new User(null, 10, null))
            .map(User::getName)
            .map(String::length)
            .orElse(0);
    System.out.println("长度: " + length);

    // flatMap 返回的对象本来就是Optional, 不用再封装
    Integer length2 = Optional.of(new User("张三", 20, Optional.ofNullable("北京")))
            .flatMap(User::getAddr)
            .map(String::length)
            .orElse(0);
    System.out.println("长度: " + length2);
  }

  @Data
  @AllArgsConstructor
  @NoArgsConstructor
  static class User {
    private String name;

    private Integer age;

    private Optional<String> addr;
  }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值