可选类型与单子



单子是函数式编程的关键概念。单子是一种设计模式,用于表示缺失值。它允许封装潜在的空值,允许在其周围进行转换,并在存在时提取实际值。根据定义,单子是一组以下参数。

  • 参数化类型 − M<T>

  • 单元函数 − T −> M<T>

  • 绑定操作 − M<T> 绑定 T −> M<U> = M<U>

关键操作

  • 左恒等律 − 如果一个函数绑定到特定值的单子上,则其结果将与将函数应用于该值的结果相同。

  • 右恒等律 − 如果单子返回值方法与原始值的单子相同。

  • 结合律 − 函数可以按任意顺序应用于单子。

Optional 类

Java 8 引入了 Optional 类,它是一个单子。它提供了与单子等效的操作。例如,return 是一个获取值并返回单子的操作。Optional.of() 获取参数并返回 Optional 对象。类似地,bind 是一个将函数绑定到单子以生成单子的操作。Optional.flatMap() 是一个对 Optional 执行操作并将其结果作为 Optional 返回的方法。

  • 参数化类型 − Optional<T>

  • 单元函数 − Optional.of()

  • 绑定操作 − Optional.flatMap()

示例 − 左恒等律

以下示例演示了 Optional 类如何遵循左恒等律。

import java.util.Optional;
import java.util.function.Function;

public class FunctionTester {
   public static void main(String[] args) {
      Function<Integer, Optional<Integer>> addOneToX 
         = x −> Optional.of(x + 1);
      System.out.println(Optional.of(5).flatMap(addOneToX)
         .equals(addOneToX.apply(5)));
   } 
}

输出

true

示例 − 右恒等律

以下示例演示了 Optional 类如何遵循右恒等律。

import java.util.Optional;

public class FunctionTester {
   public static void main(String[] args) {
      System.out.println(Optional.of(5).flatMap(Optional::of)
         .equals(Optional.of(5)));
   } 
}

输出

true

示例 - 结合律

以下示例演示了 Optional 类如何遵循结合律。

import java.util.Optional;
import java.util.function.Function;

public class FunctionTester {
   public static void main(String[] args) {
      Function<Integer, Optional<Integer>> addOneToX 
         = x −> Optional.of(x + 1);
      Function<Integer, Optional<Integer>> addTwoToX 
         = x −> Optional.of(x + 2);
      Function<Integer, Optional<Integer>> addThreeToX 
         = x −> addOneToX.apply(x).flatMap(addTwoToX);
      Optional.of(5).flatMap(addOneToX).flatMap(addTwoToX)
         .equals(Optional.of(5).flatMap(addThreeToX));
   } 
}

输出

true
广告