java 8 空指针问题的处理

public final class Optional<T> {
    //Null指针的封装
    private static final java.util.Optional<?> EMPTY = new java.util.Optional<>();
    //内部包含的值对象
    private final T value;
    private Optional() ;
    //返回EMPTY对象
    public static<T> java.util.Optional<T> empty() ;
    //构造函数,但是value为null,会报NPE
    private Optional(T value);
    //静态工厂方法,但是value为null,会报NPE
    public static <T> java.util.Optional<T> of(T value);
    //静态工厂方法,value可以为null
    public static <T> java.util.Optional<T> ofNullable(T value) ;
    //获取value,但是value为null,会报NoSuchElementException
    public T get() ;
    //返回value是否为null
    public boolean isPresent();
    //如果value不为null,则执行consumer式的函数,为null不做事
    public void ifPresent(Consumer<? super T> consumer) ;
     //过滤,如果value不为null,则根据条件过滤,为null不做事
    public java.util.Optional<T> filter(Predicate<? super T> predicate) ;
     //转换,在其外面封装Optional,如果value不为null,则map转换,为null不做事
    public<U> java.util.Optional<U> map(Function<? super T, ? extends U> mapper);
     //转换,如果value不为null,则map转换,为null不做事
    public<U> java.util.Optional<U> flatMap(Function<? super T, java.util.Optional<U>> mapper) ;
    //value为null时,默认提供other值
    public T orElse(T other);
      //value为null时,默认提供other值
    public T orElseGet(Supplier<? extends T> other);
      //value为null时,默认提供other值
    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) ;
}
 public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }
 

使用方法1、
        HashMap<String, String> map = new HashMap<>();
        map.put("1",null);
        map.put("2","99");
        String s1 = map.get("1");
        System.out.println(s1);
        String s = Optional.ofNullable(map.get("1")).orElse("如果是null会输出这个值");
        String s2= Optional.ofNullable(map.get("2")).orElse("如果是null会输出这个值");
        System.out.println(s);
        System.out.println(s2);

使用方法二、

JSONArray contInfo = Optional.of(respObj)
        .map(s->s.getJSONObject("data"))
        .map(s->s.getJSONObject("ContInfos"))
        .map(s->s.getJSONArray("ContInfo"))
        .orElseGet(JSONArray::new);

使用方法三、

public static String getName(User u) { return Optional.ofNullable(u) .map(user->user.name) .orElse("Unknown"); }

使用方法四、

public static String getChampionName(Competition comp) throws IllegalArgumentException { return Optional.ofNullable(comp)

.map(Competition::getResult) // 相当于c -> c.getResult(),下同

.map(CompResult::getChampion) .map(User::getName)

.orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available.")); }

使用方法五、

string.ifPresent(System.out::println); 

使用六、

因此,你应该明确对象不为 null 的时候使用 of()。

如果对象即可能是 null 也可能是非 null,你就应该使用 ofNullable() 方法:

Optional<User> opt = Optional.ofNullable(user);

使用7、

@Test
public void givenPresentValue_whenCompare_thenOk() {
  User user = new User("john@gmail.com", "1234");
  logger.info("Using orElse");
  User result = Optional.ofNullable(user).orElse(createNewUser());
  logger.info("Using orElseGet");
  User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser());
}

这次的输出:

Using orElse
Creating New User
Using orElseGet

这个示例中,两个 Optional 对象都包含非空值,两个方法都会返回对应的非空值。不过,orElse() 方法仍然创建了 User 对象。与之相反,orElseGet() 方法不创建 User 对象。

在执行较密集的调用时,比如调用 Web 服务或数据查询,这个差异会对性能产生重大影响。

使用8、

过滤值

除了转换值之外,Optional 类也提供了按条件“过滤”值的方法。

filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。

来看一个根据基本的电子邮箱验证来决定接受或拒绝 User(用户) 的示例:

User user = new User("anna@gmail.com", "1234");
Optional<User> result = Optional.ofNullable(user)
.filter(u -> u.getEmail() != null && u.getEmail().contains("@"));

 

参考文献

Java8 Optional 的正确使用方式 - 简书 (jianshu.com)

(431条消息) Optional是个好东西,你会用么?(全面深度解析)_BoCong-Deng的博客-CSDN博客_optional用法

(431条消息) 使用Optional.of、ofNullable、orElse、orElseGet遇到的坑_IccBoY的博客-CSDN博客_ofnullable

Java 8 中,可以使用 Optional 类来处理对象 get 出来的空指针问题。如果对象为 null,调用其 get 方法时会抛出 NoSuchElementException 异常,使用 Optional 可以避免这种异常的出现。 可以使用 Optional 对象的 map 和 flatMap 方法来对对象进行操作,并且可以避免空指针异常的出现。map 方法接受一个函数作为参数,如果 Optional 对象不为空,则将该函数应用于对象,并返回一个包含结果的 Optional 对象;如果 Optional 对象为空,则返回一个空的 Optional 对象。flatMap 方法与 map 方法类似,但是其返回值必须是一个 Optional 对象。 例如,可以使用如下代码处理对象 get 出来的空指针问题: ``` Optional<Object> optionalObj = Optional.ofNullable(obj); optionalObj.map(o -> o.toString()).orElse("default"); ``` 如果 obj 不为 null,则将其转换为字符串;如果 obj 为 null,则返回默认值 "default"。 或者,可以使用如下代码处理对象的空指针问题: ``` Optional<Object> optionalObj = Optional.ofNullable(obj); Optional<Object> result = optionalObj.flatMap(o -> Optional.ofNullable(o.getResult())); ``` 如果 obj 不为 null,并且其 getResult 方法返回的对象不为 null,则将其包装为一个 Optional 对象;否则返回一个空的 Optional 对象。 使用 Optional 对象处理对象 get 出来的空指针问题,可以避免手动进行空指针检查的繁琐过程,同时也提高了代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值