当前位置: 首页 > 工具软件 > Vavr > 使用案例 >

vavr:常用方法笔记

聂风史
2023-12-01

       使用了java8的函数式编程以后,编码效率有了显著的提高,不过相比scala 强大的函数式编程来说  功能就显得比较薄弱了。

vavr是一个Java 8+的一个函数式库,借鉴了scala函数式编程的许多特性,可以像写scala一样写java代码。

        vavr功能比较多, 今天主要介绍Tuple、Option、Try、Either 来处理数据交互。

        首先添加maven依赖

 <dependency>
     <groupId>io.vavr</groupId>
     <artifactId>vavr</artifactId>
     <version>0.10.0</version>
 </dependency>

 Tuple

       Tuple(元祖)是函数式编程中一种常见的概念。Tuple是一个不可变,并且能够以类型安全的形式保存多个不同类型的对象。vavr中 Tuple中最多可以有8个元素。当一个函数需要返回多个值时,可以使用元祖。

public static void tupleTest() {
        Tuple2<String, Integer> tuple2 = Tuple.of("Hello", 100);
        Assert.assertEquals("Hello", tuple2._1);
        Assert.assertEquals(100, tuple2._2.intValue());

        Tuple3<String, Integer, Integer> tuple3 = tuple2.concat(Tuple.of(1));

        String result = tuple2.map(String::toUpperCase, v -> v * 5).apply((str, number) -> String.join(",",
                str, number.toString()));
        Assert.assertEquals("HELLO,500", result);
    }

 Option

        Option主要用来包装null值,避免显式的null值检查,与java8的Optional比较相似,但又略有区别。Vavr 的 Option 是一个接口,有两个实现类 Option.Some 和 Option.None,分别对应有值和无值两种情况。

    public static void optionTest() {
        Option<Object> none = Option.of(null);
        Option<Object> some = Option.of("hello");

        //空被包装成None;非空被包装成Some
        Assert.assertEquals("None", none.toString());
        Assert.assertEquals("Some(hello)", some.toString());
        
        Assert.assertEquals("hello", some.get());
        Assert.assertEquals("", none.getOrElse(""));
    }

 

Try

        Try 用来包装一个可能会产生异常的计算,不用在代码中显式使用try/catch拦截异常 。Try 有两个实现类Try.Success 和 Try.Failure,分别表示成功和失败的情况,Try.Success 封装了成功时返回值, Try.Failure 则封装了失败时Throwable 对象。同时Try支持流式计算,计算成功时 执行map 和 filter 等方法。出现错误时执行 recover 方法。

public static void tryTest() {
        Try<Integer> result = Try.of(() -> 1 / 0);

        Assert.assertFalse(result.isSuccess());
        Assert.assertTrue(result.isFailure());
        
        Assert.assertEquals(Integer.valueOf(-1), result.getOrElse(-1));
        Assert.assertEquals(Integer.valueOf(-1), result.recover(e ->-1).get());

        //finally
        Try.of(() -> 1 / 0).andFinally(() -> System.out.println("资源释放"));
        //返回either对象
        Either<Throwable,Integer> either=Try.of(() -> 1 / 0).toEither();
        //抛出异常
        Try.of(() -> 1 / 0).getOrElseThrow(e -> new ArithmeticException(e.getMessage()));
    }

 

Either

         Either代表两种可能类型的值,要么是Left,要么是Right。一般认为 Left 包含错误或无效值, Right包含正确或有效值。当Either结果值为Right时,可以促发map,flatmap等操作。

        

 public static void eithherTest() {

        Supplier<Either<Throwable,String>> compute=()->{
            return new Random().nextBoolean()
                    ? Either.left(new RuntimeException("Boom!"))
                    : Either.right("Hello");
        };

        Either<String, String> either =compute.get()
                .map(str -> str + " World")
                .mapLeft(Throwable::getMessage);

        System.out.println(either.isRight()?either.get():either.getLeft());
        //System.out.println(either.<String>fold(err->err,msg->msg));
    }

 

 类似资料: