存档

2025年3月 的存档

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 标签:

解决 React Native: unable to load script 的问题

2025年3月7日 没有评论

最近又创建了一个 React Native 的项目,以前踩过的坑又忘记了,所以需要记录下来,真是好记性不如乱笔头。

现象是这样的:在有了基础页面,并运行了 npm run start 本地编译后,无论是安卓模拟器还是真机,都报告错误:

Unable to load script. Make sure you're either running Metro (run 'npx react-native start)or that your bundle index.android.bundle is packaged correctly for release.

开始的时候,以为是因为 React Native 升级到 0.78 的版本导致的,因为从 0.76 开始提示会有新的开发者工具,从0.78 开始使用新开发者工具。在回退了版本以后发现还是有这个问题。

经过检索,一个快速的解决方法是在 Android 的 Manifest 文件中加入

android:usesCleartextTraffic="true"

错误原因分析,应该是应用默认不再支持明文传输了,但是本地调试的 metro 服务,脚本传输时使用的又是 http 的数据流,导致无法获取到脚本,从而产生了前面提及的错误。

当然,在生产环境下,还是建议不要使用明文传输了哈。

分类: Android, 一句话 标签: