Java8中的Optional你今天必须得会

Java函数式编程:Optional实用技巧及示例解析
本文回顾了Java中Optional类的常用方法如empty(), ofNullable(), isPresent(), filter(), map(), flatMap()等,并提供了示例说明如何在实际项目中优雅处理null值和执行条件操作。深入理解并掌握这些技巧有助于提升代码质量和可读性。

前言:项目中有时候就是喜欢有些小伙伴喜欢用这种骚东西(还有lamada函数式编程那类东西),要看懂和维护代码,必须得会啊。这东西久不用不看,有时候碰到还是会顿一下,今天来复习复习。一些场景下使用还是不错的!

一、语法

1. empty()

empty()返回一个空的Optional对象

2. of(T value)

通过of方法所构造出的Optional对象

  1. 当value值为空时,会报NullPointerException异常
  2. 当value值不为空时,正常构造Optional对象

3.ofNullable(T value)

ofNullable方法在构造Optional的时候如果value为空,那么返回empty方法构建的Optional对象(一个Optional中value为空的Optional对象),也就是说ofNullable支持空值得创建

4. isPresent和ifPresent

ifPresent方法判断Optional中的value是否为空,不为空返回true;而ifPresent方法是在Optional中value不为空的情况下做一些操作。

if(user!=null){
    dosomething(user);
}
转换
 Optional.ofNullable(user)
    .ifPresent(u->{
        dosomething(u);
});

5.filter(Predicate<? super T> predicate)

filter方法在Optional中value不为空的情况下对Optional中的值进行过滤

示例

public void setName(String name) throws IllegalArgumentException {
    this.name = Optional.ofNullable(name).filter(User::isNameValid)
                        .orElseThrow(()->new IllegalArgumentException("Invalid username."));
}


optUser.filter(u -> u.getAge() >= 18).ifPresent(u -> System.out.println("Adult:" + u));

6.map和flatMap

map和flatMap对Optional中的对象进行转换值的操作,这两个方法唯一的区别就是接受的参数不同

Optional.ofNullable(user).map(User::getAddress);
Optional.ofNullable(user).flatMap(u ->Optional.ofNullable(u.getAddress()));

flatMap处理的参数为Optional类型;上图方法均是获取Address写法

7. orElse和orElseGet以及orElseThrow

orElse和orElseGet以及orElseThrow都是处理Optional值为空的情况,如果传入的value为空,进行操作,orElseThrow在value为空的情况抛出异常。 orElse在orElseGet的区别在与,如果传入的value不为空,orElse中的操作仍然要执行,如下图,在user不为空的情况下,仍然会输出display和创建一个新的User对象

public void optional0rElse(User user) throws Exception {
    Optional.ofNullable(user).orElse(display());
    Optional.ofNullable(user).orElseGet(this::display);
    Optional.ofNullable(user).orElseThrow(() ->new Exception("display"));
}

public User display(){
	System.out.println("display" );return new User();
}
String name = Optional.ofNullable(user).map(User::getName).orElse("no name");
import java.util.Optional;

public class Main {
    public static void main(String[] args){
        String nullValue = null;
        String optional = Optional.ofNullable(nullValue).orElse("Su");
        System.out.println(optional);
        String optionalGet = Optional.ofNullable(nullValue).orElseGet(() -> "Xiao");
        System.out.println(optionalGet);
        String nonNullOptional = Optional.ofNullable("Susan").orElse("Su");
        System.out.println(nonNullOptional);
        String nonNullOptionalGet = Optional.ofNullable("Molly").orElseGet(() -> "Xiao");
        System.out.println(nonNullOptionalGet);
    }
}

// 结果
Su
Xiao
Susan
Molly

二、示例

1.示例一

public static String getChampionName(Competition comp) throws IllegalArgumentException {
    if (comp != null) {
        CompResult result = comp.getResult();
        if (result != null) {
            User champion = result.getChampion();
            if (champion != null) {
                return champion.getName();
            }
        }
    }
    throw new IllegalArgumentException("The value of param comp isn't available.");
}

改写:

public static String getChampionName(Competition comp) throws IllegalArgumentException {
    return Optional.ofNullable(comp)
            .map(c -> c.getResult())
            .map(r -> r.getChampion())
            .map(u -> u.getName())
            .orElseThrow(() -> new IllegalArgumentException("The value of param comp isn't available."));
}

2.示例二

public User getUser(User user) throws Exception{
    if(user!=null){
        String name = user.getName();
        if("zhangsan".equals(name)){
            return user;
        }
    }else{
        user = new User();
        user.setName("zhangsan");
        return user;
    }
}

改写:

public User getUser(User user) {
    return Optional.ofNullable(user)
                   .filter(u->"zhangsan".equals(u.getName()))
                   .orElseGet(()-> {
                        User user1 = new User();
                        user1.setName("zhangsan");
                        return user1;
                   });
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值