【Java 8】Optional类与函数式编程

简介:  Java 的 Optional 类是用来处理可能存在为空的值的情况的。它是在 Java 8 中引入的,旨在减少空指针异常的发生。

Optional类的用法


  Java 的 Optional 类是用来处理可能存在为空的值的情况的。它是在 Java 8 中引入的,旨在减少空指针异常的发生。


  通常我们会用if判断对象是不是null,然后再进行一些处理,但是这样很不优雅。如下:


List<String> list = new ArrayList<>();
// 常规方法
if(list != null){
  List<String> new_list = new ArrayList<>();
  for(String s : list){
    if("".equals(s)) continue;
    new_list.add(s);
  }
  return new_list;
}else{
  return null
}
// 优雅写法 使用Optional + 函数式编程
return Optional.ofNullable(list)
    .filter(s -> !"".equals(s))
    .orElse(null);


Optional类的常用方法


  创建 Optional 对象:


Optional<T> optionalValue = Optional.of(value);  // 值不能为空
Optional<T> optionalNullableValue = Optional.ofNullable(nullableValue);  // 值可以为空
Optional<T> optionalEmpty = Optional.empty();  // 创建一个空的 Optional 对象


  判断 Optional 对象是否包含值:


optionalValue.isPresent();  // 返回 true,如果值存在


  检查并执行操作:


optionalValue.ifPresent(val -> {
    // 如果值存在,则执行操作
});


  使用默认值:

T value = optionalValue.orElse(defaultValue);  // 如果值存在,则返回该值,否则返回默认值
T value = optionalValue.orElseGet(() -> {
    // 如果值不存在,则执行自定义操作生成默认值
});



  其他方法:

optionalValue.map(val -> {
    // 对值进行映射转换操作
});
optionalValue.filter(val -> {
    // 过滤值的条件
});
optionalValue.flatMap(val -> {
    // 针对嵌套 Optional 进行操作
});


  在使用Optional类时,主要结合函数式编程方法使用:Consumer、Predicate和Function类。


Optional.ifPresent与Consumer类


  观察Optional.ifPresent的源码:


    public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }


 Consumer是一个函数式接口,代表接受一个输入参数并且不返回任何结果的操作。它通常用于对给定的参数执行一些操作,比如修改对象的状态、打印信息等。


 Consumer接口包含一个抽象方法 void accept(T t),该方法接受一个类型为T的参数,并对其进行操作。


 Optional.ifPresent示例代码:


java


Optional.ofNullable(user).ifPresent(o -> {
  // ifPresent确定是否有值 之后进行赋值或打印等无return操作
    o.setName("...");
    System.out.println(o);
}));


Optional.filter与Predicate类


  观察Optional.filter的源码:


    public Optional<T> filter(Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }

 Predicate是一个函数式接口,代表一个断言(判断条件),接受一个输入参数并返回一个布尔值。它通常用于过滤集合或校验输入参数的合法性。


 Predicate接口包含一个抽象方法 boolean test(T t),该方法接受一个类型为T的参数,并返回一个布尔值表示判断的结果。


 Optional.filter示例代码:


java


Optional.ofNullable(str).filter(o -> !"".equals(o) );



Optional.map与Function类


  观察Optional.map的源码:


    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));
        }
    }



 Function是一个函数式接口,代表接受一个输入参数并返回一个结果的操作。它通常用于将一个值转换成另一个值,或执行一些复杂的计算。


 Function接口包含一个抽象方法 R apply(T t),该方法接受一个类型为T的参数,并返回一个类型为R的结果。


 Optional.map示例代码:


java

Optional.ofNullable(str).map(o -> {
  // 进行一些操作 然后return数据
  return str;
} );


相关文章
|
2天前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
23 1
|
2天前
|
Java
【Java开发指南 | 第十四篇】Java Number类及Math类
【Java开发指南 | 第十四篇】Java Number类及Math类
14 1
|
18小时前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
21 7
|
20小时前
|
移动开发 搜索推荐 Java
Java如何支持函数式编程?,作为移动开发程序员应该怎样去规划自己的学习路线
Java如何支持函数式编程?,作为移动开发程序员应该怎样去规划自己的学习路线
|
1天前
|
设计模式 算法 Java
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
|
2天前
|
Java API 容器
Java8函数式编程接口:Consumer、Supplier、Function、Predicate
Java8函数式编程接口:Consumer、Supplier、Function、Predicate
8 1
|
2天前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
11 2
|
2天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
21 3
|
2天前
|
存储 Java 索引
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
10 3
|
2天前
|
存储 缓存 Java
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
12 2