专栏首页用户4352451的专栏使用Vavr进行函数式编程(二)

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

Option

  • 这个Option(vavr)或Optional(java8)就是提醒开发人员这个值有可能为null,你在使用前进行判空处理。
  • 在Java8中也就是我们上面所描述的Optional。
  • Vavr 中的 Option 与 Java 8 中的 Optional 是相似的。不过 Vavr 的 Option 是一个接口,有两个实现类 Option.Some 和 Option.None,分别对应有值和无值两种情况。Option 也支持常用的 map、flatMap 和 filter 等操作.
/**
 * @author yuanxindong
 * @date 2020/11/18 下午11:24
 */
public class OptionDemo {
  public static void main(String[] args) {
    // vavr 进行操作 vavr的方法相对于Java8的更多一些
    Option<String> str = Option.of("Hello");

    // vavr的几个函数
    String[] es = str.transform((a) -> a.get().split("e"));
    // 使用Map对其进行
    Option<Integer> map = str.map(String::length);
    Option<Integer> integers = str.flatMap(v -> Option.of(v.length()));
    Integer result = integers.isEmpty() ? integers.get() : null;

    // Java8的几个函数
    Optional<String> yes = Optional.of("YES");
    Optional<String> no = yes.map(String::toString);
    String result = no.isPresent() ? no.get() : "no,为null";
  }
}

Either

  • Either 表示可能有两种不同类型的值,分别称为左值或右值。只能是其中的一种情况。
  • Either 通常用来表示成功或失败两种情况。惯例是把成功的值作为右值,而失败的值作为左值。
  • 可以在 Either 上添加应用于左值或右值的计算。应用于右值的计算只有在 Either 包含右值时才生效,对左值也是同理。
package com.yuanxindong.fp.vavr.data;

import io.vavr.control.Either;

import java.util.Random;

/** @author yuanxindong */
public class EitherDemo {
  static Random random = new Random();
  private static double randomMath = random.nextInt(5);

  public static void main(String[] args) {

    Either<String, String> compute = compute();
    System.out.println(compute);

    Either<String, String> eitherLeft =
        compute().map(str -> "输出" + str).left().toEither();

    System.out.println(eitherLeft);

    Either<String, String> eitherRight =
            compute().map(str -> "输出" + str).right().toEither();
    System.out.println(eitherRight);
  }

  private static Either<String, String> compute() {

    return randomMath > 5
            ? Either.left("随机数大于5")
            : Either.right("随机数小于5");
  }
}

Try

  • Try 用来表示一个可能产生异常的计算。
  • Try 接口有两个实现类,Try.Success 和 Try.Failure,分别表示成功和失败的情况。
  • Try.Success 封装了计算成功时的返回值,而 Try.Failure 则封装了计算失败时的 Throwable 对象。
  • Try 的实例可以从接口 CheckedFunction0、Callable、Runnable 或 Supplier 中创建。
  • Try 也提供了 map 和 filter 等方法。值得一提的是 Try 的 recover 方法,可以在出现错误时根据异常进行恢复。
package com.yuanxindong.fp.vavr.data;

import io.vavr.control.Try;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.function.Consumer;

/**
 * @author yuanxindong
 * @date 2020/11/19  上午12:27
 */
public class TryDemo {
    public static void main(String[] args){

        //使用try进行捕获异常,且对异常进行恢复
        Try<Integer> result = Try.of(() -> 1 / 0).recover(e -> 1);
        System.out.println(result);

        //of里面是一个function function异常就会捕获
        Try<String> lines = Try.of(() -> Files.readAllLines(Paths.get("1.txt")))
                .map(list -> String.join(",", list))
                .andThen((Consumer<String>) System.out::println);

        //of里面是一个function
        Try<String> lineResult = Try.of(() -> Files.readAllLines(Paths.get("1.txt")))
                .map(list -> String.join(",", list)).andThen((Consumer<String>) System.out::println);

        
        boolean success = lineResult.isSuccess();

        System.out.println(lineResult);
    }

}

Lazy

  • Lazy 表示的是一个延迟计算的值。
  • 在第一次访问时才会进行求值操作,而且该值只会计算一次。之后的访问操作获取的是缓存的值。
package com.yuanxindong.fp.vavr.data;

import io.vavr.Lazy;

import java.math.BigInteger;

/**
 * @author yuanxindong
 * @date 2020/11/22  下午10:33
 */
public class LazyDemo {
  public static void main(String[] args) {
    //使用lazy将将值缓存到内存中,再次获取的时候可以直接获取
      Lazy<BigInteger> lazy = Lazy.of(() ->
              BigInteger.valueOf(1024).pow(1024));

      //判断是否已经求过值
      System.out.println(lazy.isEvaluated());

      //获取lazy的值
      System.out.println(lazy.get());

      //判断是否有进行计算过
      if(lazy.isEvaluated()){
          //将lazy进行map 再次求绝对值
          BigInteger  abs = lazy.map(t -> t.abs()).get();
      }
      
      System.out.println(lazy.isEvaluated());
  }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Vavr进行函数式编程(一)

    居士
  • 国外程序员用的火热的Vavr是什么鬼?让函数式编程更简单!

    相信很多人关注 Vavr 的原因,还是因为 Hystrix 库。Hystrix 不更新了,并在 GitHub 主页上推荐了 Resilience4j,而 Vav...

    JAVA葵花宝典
  • Java函数式编程神器 VAVR(vavr - turns java™ upside down)

    居士
  • vavr:让你像写Scala一样写Java

    Hystrix是Netflix开源的限流、熔断降级组件,去年发现Hystrix已经不再更新了,而在github主页上将我引导到了另一个替代项目——resilie...

    阿杜
  • 这个类库可以帮助你理解Java中的函数式编程!

    每当JDK发布了新版本就有同学说“你发任你发,我用Java 8”,可在工作中有不少人依然不太擅长使用Java8的新特性,而这些特性往往让Java不再“臃肿”。不...

    macrozheng
  • 这个类库可以帮助你理解Java中的函数式编程

    每当JDK发布了新版本就有同学说“你发任你发,我用Java 8”,可在工作中有不少人依然不太擅长使用Java8的新特性,而这些特性往往让Java不再“臃肿”。不...

    码农小胖哥
  • Java异常处理只有Try-Catch吗?

    今天,我们将讨论一个非常重要的主题-Java 中的异常处理。尽管有时可能会对此主题进行过多的讨论,但并非每篇文章都包含有用且相关的信息。

    武培轩
  • 用过Optional;那用过Try么?

    Java的Optional非常好用。我们一般使用Optional做非空处理,省去if的处理。主要的目的,就是为了解决Java中臭名昭著的空指针异常。

    xjjdog
  • 新项目不要再用 Spring Cloud Hystrix 了

    Spring Cloud 之前使用的断路器是 Netfilx 开源的 Hystrix 。被很多开发人员作为默认的断路器来使用。2018 年 11 月,当 Net...

    码农小胖哥
  • 用函数式编程对JavaScript进行断舍离

    译者按: 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!!

    Fundebug
  • 使用 Spring Data Repositories(中)

    原标题:Spring认证|使用 Spring Data Repositories(中)来源:(Spring中国教育管理中心)

    IT胶囊
  • 函数式编程让你忘记设计模式

    有点标题党,但是这确实是我最近使用Lambda表达式的感受。设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让开发者不去考虑这些设计模式。面向对象...

    阿杜
  • Spring MVC 函数式编程进阶

    上一篇对 Spring MVC 的函数式接口编程进行了简单入门,让很多不知道的同学见识了这种新操作。也有反应这种看起来没有传统写法顺眼,其实大家都一样。但是我们...

    码农小胖哥
  • Python函数式编程(二):常见高级函数

    --------------------------------------------------------------------------------...

    听着music睡
  • Spring JPA 定义查询方法

    ​ 可用选项基于实际存储。但是,必须有一个策略来决定创建什么样的实际查询。下一节将介绍可用的选项。

    Kindear
  • 编程小TIPS:使用函数式风格Either来编程

    最近在一些国外的技术博客中见到一个以前自己没太见过的编程风格,那就是Either,觉得非常有意思,稍微了解了下。分享给大家。

    御剑
  • Spring Boot2+Resilience4j实现容错之Bulkhead

    Resilience4j提供了两种舱壁模式(Bulkhead),可用于限制并发执行的次数:

    东溪陈姓少年
  • 【Python环境】如何使用正确的姿势进行高效Python函数式编程?

    关于函数式编程 有哪些函数式语言? 其实函数是语言很早就出现了,上世纪30年代出现的Lambda和50年代的LISP,比面向过程和对象的语言出现的更早,现代的C...

    陆勤_数据人网
  • Linux下使用exec族函数进行进程替换

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/z...

    zy010101

扫码关注云+社区

领取腾讯云代金券