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

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

1. 元组 ( Tuple )

  • 可以放入多个不同参数的数据类型。弥补Java的函数只能返回一个值的缺陷(可以理解为就是一个特殊对象)。
  • 不易放入多个变量,会导致代码不易阅读。
  • demo
      //原数组的
      Tuple2<String, Integer> tuple2 = Tuple.of("Hello", 100);
      //对Tuple2内部变量进行操作
      Tuple2<String, Integer> updatedTuple2 = tuple2.map(String::toUpperCase, v -> v * 5);
      //进行Tuple2转换为某个特定的变量
      String result = updatedTuple2.apply((str, number) -> String.join(", ",
              str, number.toString()));
      System.out.println(result);

2. 函数 ( Function )

  • Java 8 中只提供了接受一个参数的 Function 和接受 2 个参数的 BiFunction。
  • Vavr 提供了函数式接口 Function0、Function1 到 Function8,可以描述最多接受 8 个参数的函数。
  • 但是比较难受的是这些接口的方法 apply 不能抛出异常。如果需要抛出异常,可以使用对应的接口 CheckedFunction0、CheckedFunction1 到 CheckedFunction8。
  • demo如下
package com.yuanxindong.fp.vavr.data;

import io.vavr.Function3;
import io.vavr.Tuple;
import io.vavr.Tuple3;

import java.util.function.Function;

/**
 * @author yuanxindong
 * @date 2020/11/17 下午11:22
 */
public class FunctionDemo {

  /**
   * 使用普通Java8函数function
   *
   * @param valueToBeOperated
   * @param function
   */
  static void modifyTheValue(int valueToBeOperated, Function<Integer, Integer> function) {
    int newValue = function.apply(valueToBeOperated);
    System.out.println(newValue);
  }

  /**
   * 使用vavr函数
   *
   * @param valueToBeOperated tuple的方式传递函数
   * @param function 函数
   */
  static void modifyTheValue2(
      Tuple3<Integer, Integer, Integer> valueToBeOperated,
      Function3<Integer, Integer, Integer, String> function) {

    // 将tuple中的参数放入
    String newValue =
        function.apply(valueToBeOperated._1, valueToBeOperated._2, valueToBeOperated._3);
    System.out.println(newValue);
  }

  public static void main(String[] args) {

    int incr = 20;
    int myNumber = 10;

    // 通过传递函数进行操作这个MyNumber这个值
    modifyTheValue(myNumber, val -> val + incr);

    Tuple3<Integer, Integer, Integer> value = Tuple.of(1, 2, 3);

    // 使用vavr函数进行计算 val1 + val2 + val3的字符传
    modifyTheValue2(value, (val1, val2, val3) -> val1 + val2 + val3 + "");
  }
}
  1. 组合
  • 函数的组合指的是用一个函数的执行结果作为参数,来调用另外一个函数所得到的新函数。
  • demo
/**
 * @author yuanxindong
 * @date 2020/11/18 上午12:08
 */
public class FunctionCombinationDemo {
  public static void main(String[] args) {
    // 定义函数
    Function3<Integer, Integer, Integer, Integer> function3 = (v1, v2, v3) -> (v1 + v2) * v3;

    // 使用andThen对函数中的值进行操作
    Function3<Integer, Integer, Integer, Integer> composed = function3.andThen(v -> v * 100);

    // 使用apply进行函数包装
    int result = composed.apply(1, 2, 3);
    // 输出结果 900
    System.out.println(result);

    //另一种表达方式
    Function1<String, String> function1 = String::toUpperCase;

    //先通过函数将对象转换为字符串,在通过函数将这个数据进行再次操作
    Function1<Object, String> toUpperCase = function1.compose(Object::toString);
    //输入数组
    String str = toUpperCase.apply(List.of("a", "b"));
    System.out.println(str);
    // 输出结果[A, B]
  }
}
  • 从中我们可以看到andThen和compose的区别在哪里吗?前者是先执行function函数,在执行function里面的函数。后者反之。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

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

    JAVA葵花宝典
  • 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
  • 函数式编程让你忘记设计模式

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

    阿杜
  • 使用 Spring Data Repositories(中)

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

    IT胶囊
  • java8 函数式编程一

    为什么要先从函数接口说起呢?因为我觉得这是 java8 函数式编程的入口呀!每个函数接口都带有 @FunctionalInterface 注释,有且仅有一个未实...

    JMCui
  • Spring MVC 函数式编程进阶

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

    码农小胖哥
  • Spring Boot2+Resilience4j实现容错之Bulkhead

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

    东溪陈姓少年
  • Python函数式编程(一):高级函数

    听着music睡
  • 【Python环境】如何使用正确的姿势进行高效Python函数式编程?

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

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

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

    zy010101
  • 函数式编程 : 一个程序猿进化的故事

    绿巨人
  • Spring JPA 定义查询方法

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

    Kindear

扫码关注云+社区

领取腾讯云代金券