【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 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
11天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
57 6
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
65 8
|
2月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
76 17
|
2月前
|
Java API
Java中的Lambda表达式与函数式编程####
【10月更文挑战第29天】 本文将深入探讨Java中Lambda表达式的实现及其在函数式编程中的应用。通过对比传统方法,我们将揭示Lambda如何简化代码、提高可读性和维护性。文章还将展示一些实际案例,帮助读者更好地理解和应用Lambda表达式。 ####
|
2月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
37 4
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
137 4
|
2月前
|
Java API 开发者
Java中的Lambda表达式与函数式编程####
在Java的演变过程中,Lambda表达式和函数式编程的引入无疑是一次重大的飞跃。本文将深入探讨Lambda表达式的定义、用法及优势,并结合实例说明如何在Java中利用Lambda表达式进行函数式编程。通过对比传统编程方式,揭示Lambda表达式如何简化代码、提高开发效率和可维护性。 ####