一些好用的java语言函数式编程库
Posted chen陈序猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些好用的java语言函数式编程库相关的知识,希望对你有一定的参考价值。
从java8开始,java语言正式支持了lambda表达式,这标志着可以使用java语言写出符合函数式编程风格的代码。在java领域,也诞生了几个函数式编程库,有了这些库的支持,就能够编程出更加符合函数式编程风格的代码了。
函数式编程库之vavr
Vavr 是Java 8+中一个函数式库,提供了一些不可变数据类型及函数式控制结构。
添加依赖:
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.9.0</version>
</dependency>
http://www.baeldung.com/vavr
我比较喜欢的是下面一些特性:
Try
我们知道,在函数式编程风格的代码中进行try catch 是非常反人类的事情。在Vavr中, Try是一个容器,来包装一段可能产生异常的代码。Option用来包装可能产生null的对象,而Try用来包装可能产生异常的代码块,这样就不用显式的通过try-catch来处理异常。下面的代码用来检查是否产生了异常。
@Test
public void testTry() {
Try<Integer> result = Try.of(() -> 1 / 0);
assertTrue(result.isFailure());
}
模式匹配Pattern Matching
我们知道,在代码中有太多的if else分支,代码将非常丑陋,即使换成switch case,也并不能缓解很多:
@Test
public void patternWithjdk7() {
int input = 3;
String output;
if (input == 0) {
output = "zero";
}
if (input == 1) {
output = "one";
}
if (input == 2) {
output = "two";
}
if (input == 3) {
output = "three";
}
else {
output = "unknown";
}
}
利用Vavr库,上面的代码可以换成:
@Test
public void testWithPatternMatch() {
int input = 2;
String output = Match(input).of(
Case($(1), "one"),
Case($(2), "two"),
Case($(3), "three"),
Case($(), "unknown"));
}
在一些其他的场景中,我们还可以通过谓词(predicate)来替换表达式。
Match(arg).of(
Case(isIn("-h", "--help"), o -> run(this::displayHelp)),
Case(isIn("-v", "--version"), o -> run(this::displayVersion)),
Case($(), o -> run(() -> {
throw new IllegalArgumentException(arg);
}))
);
这样改造后的代码是不是帅气了不少。
函数式编程库之jool
jOOλ(also jOOL,jOO-Lambda) 该库封装了原生jdk中的每一个功能性接口。具有相同功能而且也允许抛出被检异常。这在使用老的JDK API时特别有用。
请参阅:https://blog.jooq.org/tag/joo-lambda/
请参阅:https://github.com/jOOQ/jOOL
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jool-java-8</artifactId>
<version>0.9.13</version>
</dependency>
Unchecked.comsumer
允许抛出被检查异常的功能非常好用:比如说把所有的Thread join。
其实底层是将非运行时异常封装了成了运行时异常。
Arrays.stream(threads).forEach(Unchecked.consumer(
t -> t.join()
));
封装JDBC
使用jool库,还可以有如下操作:
SQL.stream(stmt, Unchecked.function(rs ->
new SQLGoodies.Schema(
rs.getString("SCHEMA_NAME"),
rs.getBoolean("IS_DEFAULT")
)
))
.forEach(System.out::println);
函数式编程库之streamex
该库相当于java8 lambda加强版。
该库声称对原有功能做了不少增强,由于笔者此库暂未使用过,在此不做详细探讨。有兴趣可以直接点击链接查看。
(完)
chen陈序猿|一起学技术吧
以上是关于一些好用的java语言函数式编程库的主要内容,如果未能解决你的问题,请参考以下文章