存档

文章标签 ‘库’

Java 里的元组使用

2025年3月25日 没有评论

在最近的 Sping boot 项目里,想要一次性返回多个对象,按照过去 .Net的经验,很容易想到的就是使用元组 Tuple,但是第一下居然没有找到,不过有 HashMap,看起来似乎也是不错的选择,但是存在需要强制转换的情况,某些场景下可能会出错。

不是很死心,于是就搜索了一下,找到了 vavr 这个库,比较简单,大家可以凑活使用。

首先是在 pom.xml 里添加依赖:

<!-- https://mvnrepository.com/artifact/io.vavr/vavr -->
<dependency>
    <groupId>io.vavr</groupId>
    <artifactId>vavr</artifactId>
    <version>0.10.6</version>
</dependency>

使用 Tuple.of 来创建对象代码示例:

Tuple2<String, LocalDateTime> element = Tuple.of("Name", LocalDateTime.now());

创建两个元素的是 Tuple2,三个元素就是 Tuple3,这个命名方式有点特别,哈哈。

更新元组里的内容:element.update1(“名称”); 也就是 update[1-n]的方式。

读取元组元素的内容,element._1() 是获取第一个值,element._2()就是获取第二个值,以此类推。

这个库是 Apache 协议,可以商用,不错。

我又继续搜索了下,元组只是其支持的一个功能,函数式编程也支持,andThen、compose 看起来好高级哇。

异常处理的写法也不错,我简单地复制下代码:

Try result = Try.of(() -> 0)
                .map((a) -> 10 / a) //即使此处抛出异常,不会导致当前线程结束。这里无需使用 try{}catch()对代码进行捕获
                .andThen(() -> System.out.printf("--抛出异常此处不会执行--")) //执行一个动作,不修改结果
                .map(i -> {
                    System.out.println("当前值:" + i);
                    return i + 10;
                })
                .onFailure(e -> e.printStackTrace())//失败时会触发onFailure
                .recover(ArithmeticException.class, 1000) //如果遇到 Exception类型的异常,则返回1000
                .map((a) -> a + 1);

        System.out.println("是否抛出异常:" + result.isFailure());
        System.out.println("执行结果:" + result.getOrElse(100)); //如果有异常发生,则返回100

延迟计算,这个也高级,但是潜意识感觉,如果用的不好,很容易给自己挖坑。

Lazy<Double> lazy = Lazy.of(Math::random)
                .map(i -> {
                    System.out.println("-----正在进行计算,此处只会执行一次------");
                    return i * 100;
                });
        System.out.println(lazy.isEvaluated());
        System.out.println(lazy.get()); //触发计算
        System.out.println(lazy.isEvaluated());
        System.out.println(lazy.get());//不会重新计算,返回上次结果

还有另外一种线程操作的写法:

System.out.println("当前线程名称:" + Thread.currentThread().getName());
        Integer result = Future.of(() -> {
            System.out.println("future线程名称:" + Thread.currentThread().getName());
            Thread.sleep(2000);
            return 100;
        })
                .map(i -> i * 10)
                .await(3000, TimeUnit.MILLISECONDS) //等待线程执行3000毫秒
                .onFailure(e -> e.printStackTrace())
                .getValue() //返回Optional<Try<Integer>>类型结果
                .getOrElse(Try.of(() -> 100)) //如果Option 为 empty时,则返回Try(100)
                .get();
        System.out.println(result); // 1000

大家放心用吧,一用一个不吱声。

分类: Java 标签: