Vavr(以前称为Javaslang)是Java 8+的对象功能库,旨在减少我们需要编写的代码量并提高代码质量。网址:www.vavr.io/
它提供了持久的集合,用于错误处理的功能抽象,并发编程,模式匹配(在最新版本中已弃用,以支持Java新的模式匹配功能)等等。
它是在values的基础上建立的,灵感来自Rich Hickey(Clojure和Datomic)的The Value of Values,因此,Vavr让我们利用values优点,将错误和异常转换未values值。
这些值具有一些函数性操作,例如map,flatMap,过滤器,fold等,这有助于我们实现流利且可读的代码。
假设您需要假设地处理一些用户帐户和保存在数据库中的帖子:
public User processUser(Long userId) {
User user = repository.findById(userId);
if (null != user) {
try {
processUserAccounts(user);
return processUserPosts(user);
} catch (ExceptionA ea) {
log.error(ea.getMessage());
throw new BusinessException(ea);
} catch (ExceptionB eb) {
log.error(eb.getMessage());
throw new BusinessException(eb);
}
} else {
throws new BusinessException("user doesn't exists");
}
}
|
上面代码是是丑陋的。但是,让我们看看如何使用Vavr库的Either语法:
Function<Long, Either<Error, User>> processUser =
userId -> getUserFromDB(userId) // returns either Left(Error) or Right(User)
.map(this::processUserAccounts)
.map(this::processUserPosts);
Function<User, Either<Error, User>> getUserFromDB =
userId -> repository
.getUser(userId) // repository returns vavr's Option<User>
.toEither(new Error("user doesn't exists"));
Function<User, Either<Error, User>> processUserAccounts = user -> {...}
Function<User, Either<Error, User>> processUserPosts = user -> {...}
|
这些例子很简单。每个功能都由我们实现。这样我们可以摆脱异常并返回Eithers。
更多了解点击标题