选项和 Monad


Monad 是函数式编程的一个关键概念。Monad 是一种有助于表示缺失值的设计模式。它允许包装潜在的空值,允许对其进行转换并提取实际值(如果存在)。根据定义,单子是一组以下参数。

  • 参数化类型- M<T>

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

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

关键操作

  • Left Identity - 如果函数绑定在特定值的 monad 上,则其结果将与函数应用于该值相同。

  • 正确的身份- 如果 monad 返回方法与原始值的 monad 相同。

  • 关联性- 函数可以以任何顺序应用在单子上。

选修课

Java 8 引入了Optional 类,它是一个monad。它提供了相当于 monad 的操作。例如return是一个接受一个值并返回 monad 的操作。Optional.of() 接受一个参数并返回可选对象。类似地,bind是将函数绑定到 monad 以生成 monad 的操作。Optional.flatMap() 是对Optional执行操作并将结果作为Optional返回的方法。

  • 参数化类型- 可选<T>

  • 一个单元函数-Optional.of()

  • 绑定操作-Optional.flatMap()

示例 - 左身份

以下示例显示了Optional类如何遵守Left Identity规则。

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类如何遵守Right Identity规则。

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