一些好用的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(stmtUnchecked.function(rs ->
    new SQLGoodies.Schema(
        rs.getString("SCHEMA_NAME"),
        rs.getBoolean("IS_DEFAULT")
    )
))
.forEach(System.out::println);

函数式编程库之streamex

该库相当于java8 lambda加强版。

该库声称对原有功能做了不少增强,由于笔者此库暂未使用过,在此不做详细探讨。有兴趣可以直接点击链接查看。

(完)

chen陈序猿|一起学技术吧

微信ID:echo_陈
长按二维码添加公众号

以上是关于一些好用的java语言函数式编程库的主要内容,如果未能解决你的问题,请参考以下文章

《On Java 8》中文版 第十三章 函数式编程

java自制简易函数式编程库初出炉

面向 Java 8 和函数式编程的容错库 Resilience4j | 软件推介

Java 8 新语法习惯 (更轻松的函数式编程)

函数式编程终于成为了主流!

Java如何支持函数式编程?