乐字节Java8核心特性之Optional

栏目: 编程语言 · Java · 发布时间: 6年前

内容简介:大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦。Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。

大家好啊,上次小乐给大家介绍了 Java 8最最重要的一个特性——Stream流,点击可以回顾哦。

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

1、Optinal对象构建&值获取方法

乐字节Java8核心特性之Optional

实例代码如下

Optional<String> optional = Optional.of("java8");

// NullPointerException空指针异常  值不能为空
optional = Optional.of(null);
optional = Optional.ofNullable("java8");
System.out.println(optional.get());
System.out.println(optional.orElse("java"));
System.out.println(optional.orElseGet(()-> "java"));
System.out.println(optional.orElseThrow(()->new RuntimeException()));

// 值可空  推荐使用
optional = Optional.ofNullable(null);
// 运行时抛出NoSuchElementException异常
System.out.println(optional.get());
System.out.println(optional.orElse("java"));
System.out.println(optional.orElseGet(()-> "java"));
System.out.println(optional.orElseThrow(()->new RuntimeException()));

2、Optional 逻辑判断操作

这里可以使用Optional提供的API相关方法来执行逻辑判断操作 .

乐字节Java8核心特性之Optional

3、用户记录查询-消除null判断

以用户模块为例,UserService中提供queryUserById方法供客户端调用,如下:

public User queryUserById(Integer userId){

  return null;
}

客户端调用Java8以前逻辑代码为例避免null通常为如下形式

User user= userService.queryUserById(10);
if(null != user){
    System.out.println("匹配到该用户");
    /**
    * 执行其他操作
    */
}else{
    System.out.println("用户不存在");
}

使用Optional 形式如下:

Optional<User> userOptional =   Optional.ofNullable(user);
// 使用isPresent 方法进行判断
if(userOptional.isPresent()){
    System.out.println("匹配到该用户");
    /**
    * 执行其他操作
    */
}else{
    System.out.println("用户不存在");
}

当然,既然使用了Optional了,对于if else 的代码通常也是可以给省略掉 如下(程序逻辑只关注非空的情况,使用ifPresent 进行if判断):

// 使用ifPresent 执行if 判断操作
  userOptional.ifPresent((u)->{
      System.out.println("匹配到该用户");
      /**
      * 执行其他操作
      */
  });

使用map orElse方法同样也可以执行if else的逻辑判断 如下:

userOptional.map((u) -> {
    System.out.println("匹配到该用户!");
    /**
    * 执行其他操作
    */
    return u;
}).orElse(null);

4、业务逻辑结果返回

通常,在在web网站时,对于用户登录逻辑进行处理时,如果登录的结果通常由后端接口来返回,而对于后端代码的实现在Java8以前可能是这样的 借助ResultInfo 返回用户登录结果

ResultInfo resultInfo=null;
user  = userService.queryUserByUnameAndUpwd(uname,upwd);
// 判断user对象是否为空
if (user == null) { // 用户不存在
    resultInfo=new ResultInfo(300,"登录失败,用户名或密码错误",null);
}else{
    resultInfo=new ResultInfo(200,"登录成功",user);
}

此时,使用Optional map orElse同样可以进行替换如下(省去if else 的逻辑代码)

userOptional= Optional.ofNullable(userService.queryUserByUnameAndUpwd(uname,upwd));
// 执行 map orElse 判断
userOptional.map((u)->{
    /**
    * 如果用户记录存在
    */
    return new ResultInfo(200,"登录成功",u);
}).orElse(new ResultInfo(300,"登录失败,用户名或密码错误",null));

5、Optional 值过滤

乐字节Java8核心特性之Optional

filter方法在Optinal对象非空的基础之上加入断言判断操作,方法返回值仍然为Optinal。这种操作对于参数判断提供很大便利,例如参数满足指定条件的后续操作 sql 查询操作字符串拼接,常见的servlet处理多请求页面转发处理等操作。

5.1 页面转发过滤

在使用Servlet 编写web 后端代码对页面进行转发控制时,通常会通过一个Servelt 来转发不同步请求以及相应页面,使用Optional 来达到参数合法性过滤的操作,相关如下:

String action = "main";
Optional<String> optional = Optional.ofNullable(action);
String page = optional.filter(a -> a.trim().equals("") || a.equals("main"))
            .map((str) -> {
                System.out.println("转发到主页面");
                return "main";
            }).orElseGet(() -> {
                System.out.println("抓发到首页面");
                return "index";
            });

5.2 多条件动态sql参数过滤

对于web应用多条件查询操作,通常后端在进行处理时更多的是对sql进行动态拼接来达到最终目的(搜索引擎除外),此时Optional同样能够用于该场景下参数值过滤操作,相关代码如下:

String title = "";
String type = "";
StringBuilder sqlBuilder = new StringBuilder("select * from blog where user_id=2019 ");
Optional.ofNullable(title)
        .filter(StringUtils::isNoneBlank)
        .ifPresent(t -> {
            sqlBuilder.append(" and title " + "%" + title + "%");
    });
Optional.ofNullable(type)
        .filter(t -> !t.trim().equals("") && !t.equals("1"))
        .ifPresent(t -> {
            sqlBuilder.append(" and  type = " + type);
    });

6、Optional应用

Java8中Optional的引入,使得开发避免了大量Null指针的出现,借助相关方法避免了if else这种繁琐的逻辑代码编写,对于其应用,在处理空的场景下应用较多,对于if else的逻辑场景,同样使用Optional让程序更加简洁,同时使用Optional可以实现代码的链式处理。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java Servlet & JSP Cookbook

Java Servlet & JSP Cookbook

Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99

With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具