JDKCompletableFuture 使用case

该博客探讨了如何使用Java的CompletableFuture进行异步任务处理,并通过配置线程池来优化性能。示例代码展示了如何创建并行任务,模拟接口调用延迟,并通过allOf方法等待所有任务完成。同时,还实现了一个评估函数,根据编辑距离计算结果的相似度,并对结果进行排序。
public class JDKCompletableFutureTest {
    private static ExecutorService executorService = new ThreadPoolExecutor(
            Config.get().getInt("engine.search.CompletableFuture.pool.core.size",
                    Runtime.getRuntime().availableProcessors() * 2),
            Config.get().getInt("engine.search.CompletableFuture.pool.max.size",
                    Runtime.getRuntime().availableProcessors() * 10),
            60L,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(Config.get().getInt(
                    "engine.executor.CompletableFuture.queue.size", 5000))
    );

    public static void main(String[] args) throws ExecutionException, InterruptedException {


        long time = System.currentTimeMillis();
        CompletableFuture<MarklandBean> f1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(4000); // 模拟接口调用耗时1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            MarklandBean marklandBean = new MarklandBean();
            marklandBean.setName("人民广场大动静店");
            return marklandBean;
        }, executorService);
        CompletableFuture<MarklandBean> f2 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2500); // 模拟接口调用耗时1.5秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            MarklandBean marklandBean = new MarklandBean();
            marklandBean.setName("人民广场动静分店");
            return marklandBean;
        });
        CompletableFuture<MarklandBean> f3 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2900); // 模拟接口调用耗时0.6秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            MarklandBean marklandBean = new MarklandBean();
            marklandBean.setName("人广淞虹路分店");
            return marklandBean;
        });

        List<CompletableFuture<MarklandBean>> list = new ArrayList<>();
        list.add(f1);
        list.add(f2);
        list.add(f3);
        Thread.sleep(1200);
        CompletableFuture<Void> f4 = CompletableFuture.allOf(list.toArray(new CompletableFuture[]{}));

        String inputWord = "人民广场淞虹路分店";
        System.out.println("耗时1:" + (System.currentTimeMillis() - time));
        MarklandBean result = getMarklandBean(list, inputWord);
        System.out.println("耗时2:" + (System.currentTimeMillis() - time));
    }

    private static MarklandBean getMarklandBean(List<CompletableFuture<MarklandBean>> list, String inputWord) {
        list.forEach(f -> {
            try {
                System.out.println("异步结果:" + f.get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        MarklandBean result = null;
        try {
            List<MarklandBean> results = list.stream().filter(it -> it != null).map(it -> {
                MarklandBean i = null;
                try {
                    i = it.get(1000, TimeUnit.MILLISECONDS);
                    i.setLat(evaluate(i.getName(), inputWord));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return i;
            }).sorted(Comparator.comparing(MarklandBean::getLat).reversed()).collect(Collectors.toList());

            result = results.stream().findFirst().get();

            results.forEach(f -> {
                try {
                    System.out.println("排序后的结果是:" + f);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            System.out.println("最好的地标:" + result.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static double evaluate(String a, String b) {
        if (a == null && b == null) {
            return 1f;
        }
        if (a == null || b == null) {
            return 0F;
        }
        int editDistance = StringUtils.getLevenshteinDistance(a, b);
        return 1 - ((double) editDistance / Math.max(a.length(), b.length()));
    }
}

 

<think>好的,用户让我介绍一下PostgreSQL中如何使用CASE WHEN。虽然我的专长是Java,但这个问题涉及到PostgreSQL的SQL语法,我需要先回忆一下相关的知识。 首先,CASE WHEN在SQL中用于条件判断,类似于编程语言中的if-else语句。PostgreSQL支持两种形式的CASE表达式:简单CASE和搜索CASE。简单CASE是当某个字段等于特定值时执行,而搜索CASE可以处理更复杂的条件,比如范围判断或多个条件组合。 接下来,我需要举几个例子来说明这两种用法。比如,简单CASE的例子可能是一个根据部门编号返回部门名称的情况,而搜索CASE的例子可以是根据成绩划分等级。同时,用户可能还会想知道如何在UPDATE语句中使用CASE WHEN,或者在聚合函数中结合使用。 然后,我需要解释每个例子的作用,比如第一个简单CASE示例如何将dept_no转换为部门名称。第二个搜索CASE示例根据score的值返回不同的等级。第三个例子展示如何在UPDATE中根据条件修改数据,第四个则是在SUM函数中使用CASE进行条件统计。 还要注意说明CASE WHEN的基本语法结构,包括WHEN、THEN、ELSE和END的关键字使用,以及两种形式的区别。同时,提醒用户在使用时要注意条件顺序,因为执行是从上到下的,一旦满足条件就返回结果,剩下的条件不再判断。 最后,确保回答符合格式要求,先回答问题,给出解释和代码示例,然后提出相关问题。相关问题需要围绕PostgreSQL的CASE WHEN,可能涉及性能优化、与其他条件语句的区别、在JOIN中的应用等。</think><< 在PostgreSQL中,`CASE WHEN`是条件表达式,用于根据条件执行不同的逻辑分支。它类似于编程语言中的`if-else`语句,常用于SELECT查询、UPDATE操作或聚合函数中。以下是具体用法和示例: ### 1. 简单CASE表达式 ```sql SELECT employee_id, CASE dept_no WHEN 1 THEN '技术部' WHEN 2 THEN '市场部' ELSE '其他部门' END AS department FROM employees; ``` **解释**:当`dept_no`字段等于1时返回'技术部',等于2时返回'市场部',其他情况返回'其他部门' ### 2. 搜索式CASE表达式 ```sql SELECT student_name, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' ELSE 'D' END AS grade FROM exam_results; ``` **解释**:根据score字段的值范围返回不同的等级评定 ### 3. 在UPDATE语句中使用 ```sql UPDATE products SET price = CASE WHEN stock < 10 THEN price * 1.1 -- 库存不足时涨价10% WHEN stock > 100 THEN price * 0.9 -- 库存过剩时降价10% ELSE price END; ``` ### 4. 聚合函数中的使用 ```sql SELECT COUNT(*) AS total_orders, SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_orders, SUM(CASE WHEN order_date > '2023-01-01' THEN amount ELSE 0 END) AS recent_sales FROM orders; ``` **注意事项**: 1. `CASE`表达式必须包含`END`结尾 2. 条件判断按书写顺序执行,第一个满足的条件会立即返回 3. 可以嵌套使用多个`CASE`表达式 4. 当所有条件都不满足且没有`ELSE`子句时,返回NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值