首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Vavr 进行函数式编程(3)值

使用 Vavr 进行函数式编程(3)值

值Vavr 中提供了一些不同类型的值。
OptionVavr 中的 Option 与 Java 8 中的 Optional 是相似的。不过 Vavr 的 Option 是一个接口,有两个实现类 Option.Some 和                Option.None,分别对应有值和无值两种情况。使用 Option.some 方法可以创建包含给定值的 Some 对象,而 Option.none 可以获取到                None 对象的实例。Option 也支持常用的 map、flatMap 和 filter 等操作,如清单 6 所示。
清单 6. 使用 Option                的示例
1
2
3
Option<String> str = Option.of("Hello");
str.map(String::length);
str.flatMap(v -> Option.of(v.length()));




EitherEither 表示可能有两种不同类型的值,分别称为左值或右值。只能是其中的一种情况。Either                通常用来表示成功或失败两种情况。惯例是把成功的值作为右值,而失败的值作为左值。可以在 Either 上添加应用于左值或右值的计算。应用于右值的计算只有在 Either                包含右值时才生效,对左值也是同理。
在清单 7 中,根据随机的布尔值来创建包含左值或右值的 Either 对象。Either 的                map 和 mapLeft 方法分别对右值和左值进行计算。
清单 7. 使用 Either                的示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import io.vavr.control.Either;
import java.util.concurrent.ThreadLocalRandom;

public class Eithers {

  private static ThreadLocalRandom random =
ThreadLocalRandom.current();

  public static void main(String[] args) {
    Either<String, String> either = compute()
        .map(str -> str + " World")
        .mapLeft(Throwable::getMessage);
    System.out.println(either);
  }

  private static Either<Throwable, String> compute() {
    return random.nextBoolean()
        ? Either.left(new RuntimeException("Boom!"))
        : Either.right("Hello");
  }
}




TryTry 用来表示一个可能产生异常的计算。Try 接口有两个实现类,Try.Success 和 Try.Failure,分别表示成功和失败的情况。Try.Success                封装了计算成功时的返回值,而 Try.Failure 则封装了计算失败时的 Throwable 对象。Try 的实例可以从接口                CheckedFunction0、Callable、Runnable 或 Supplier 中创建。Try 也提供了 map 和 filter 等方法。值得一提的是                Try 的 recover 方法,可以在出现错误时根据异常进行恢复。
在清单 8 中,第一个 Try 表示的是 1/0 的结果,显然是异常结果。使用 recover 来返回                1。第二个 Try 表示的是读取文件的结果。由于文件不存在,Try 表示的也是异常。
清单 8. 使用 Try                的示例
1
2
3
4
5
6
7
Try<Integer> result = Try.of(() -> 1 / 0).recover(e -> 1);
System.out.println(result);

Try<String> lines = Try.of(() -> Files.readAllLines(Paths.get("1.txt")))
    .map(list -> String.join(",", list))
    .andThen((Consumer<String>) System.out::println);
System.out.println(lines);




LazyLazy 表示的是一个延迟计算的值。在第一次访问时才会进行求值操作,而且该值只会计算一次。之后的访问操作获取的是缓存的值。在清单 9 中,Lazy.of 从接口 Supplier 中创建 Lazy 对象。方法 isEvaluated 可以判断 Lazy                对象是否已经被求值。
清单 9. 使用 Lazy                的示例
1
2
3
4
5
Lazy<BigInteger> lazy = Lazy.of(() ->
BigInteger.valueOf(1024).pow(1024));
System.out.println(lazy.isEvaluated());
System.out.println(lazy.get());
System.out.println(lazy.isEvaluated());

返回列表