使用了java8的函数式编程以后,编码效率有了显著的提高,不过相比scala 强大的函数式编程来说 功能就显得比较薄弱了。
vavr是一个Java 8+的一个函数式库,借鉴了scala函数式编程的许多特性,可以像写scala一样写java代码。
vavr功能比较多, 今天主要介绍Tuple、Option、Try、Either 来处理数据交互。
首先添加maven依赖
io.vavr
vavr
0.10.0
Tuple(元祖)是函数式编程中一种常见的概念。Tuple是一个不可变,并且能够以类型安全的形式保存多个不同类型的对象。vavr中 Tuple中最多可以有8个元素。当一个函数需要返回多个值时,可以使用元祖。
public static void tupleTest() {
Tuple2 tuple2 = Tuple.of("Hello", 100);
Assert.assertEquals("Hello", tuple2._1);
Assert.assertEquals(100, tuple2._2.intValue());
Tuple3 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主要用来包装null值,避免显式的null值检查,与java8的Optional比较相似,但又略有区别。Vavr 的 Option 是一个接口,有两个实现类 Option.Some 和 Option.None,分别对应有值和无值两种情况。
public static void optionTest() {
Option
Try 用来包装一个可能会产生异常的计算,不用在代码中显式使用try/catch拦截异常 。Try 有两个实现类Try.Success 和 Try.Failure,分别表示成功和失败的情况,Try.Success 封装了成功时返回值, Try.Failure 则封装了失败时Throwable 对象。同时Try支持流式计算,计算成功时 执行map 和 filter 等方法。出现错误时执行 recover 方法。
public static void tryTest() {
Try 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 either=Try.of(() -> 1 / 0).toEither();
//抛出异常
Try.of(() -> 1 / 0).getOrElseThrow(e -> new ArithmeticException(e.getMessage()));
}
Either代表两种可能类型的值,要么是Left,要么是Right。一般认为 Left 包含错误或无效值, Right包含正确或有效值。当Either结果值为Right时,可以促发map,flatmap等操作。
public static void eithherTest() {
Supplier> compute=()->{
return new Random().nextBoolean()
? Either.left(new RuntimeException("Boom!"))
: Either.right("Hello");
};
Either either =compute.get()
.map(str -> str + " World")
.mapLeft(Throwable::getMessage);
System.out.println(either.isRight()?either.get():either.getLeft());
//System.out.println(either.fold(err->err,msg->msg));
}