阿里ai流式输出
文章目录
- 依赖
- 代码
- 输出的结果
- ✅ 快速排序(Quick Sort)Java 8 示例:
- ✅ 输出示例:
- ✅ 说明:
依赖
<!-- OkHttp 客户端 --><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.11.0</version> <!-- 使用最新版本 --></dependency><!-- Jackson JSON 处理 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version> <!-- 使用最新版本 --></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java --><dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.6.0</version></dependency>
代码
package com.example.demo.tools;import com.alibaba.dashscope.utils.JsonUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import okhttp3.*;
import okio.BufferedSource;
import org.jetbrains.annotations.NotNull;import java.io.IOException;
import java.util.concurrent.TimeUnit;public class 阿里ai流式输出 {// 定义API的URL和API_KEYprivate static final String API_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions";private static final String API_KEY = "换成自己的即可";public static void main(String[] args) {// 1. 创建OkHttp客户端OkHttpClient client = new OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS).readTimeout(0, TimeUnit.SECONDS) // 无限读取超时,用于流式传输.writeTimeout(30, TimeUnit.SECONDS).build();// 2. 准备请求体String requestBody = "{\n" +" \"model\": \"qwen-plus\",\n" +" \"messages\": [\n" +" {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n" +" {\"role\": \"user\", \"content\": \"帮我写一个快速排序,java8环境\"}\n" +" ],\n" +" \"stream\": true\n" +"}";// 3. 创建请求Request request = new Request.Builder().url(API_URL).header("Authorization", "Bearer " + API_KEY).header("Content-Type", "application/json").post(RequestBody.create(MediaType.parse("application/json"), requestBody)).build();// 4. 发送异步请求并处理流式响应client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {System.err.println("请求失败: " + e.getMessage());}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {if (!response.isSuccessful()) {System.err.println("请求失败: " + response.code() + " - " + response.message());response.close();return;}// 5. 处理流式响应try (ResponseBody responseBody = response.body()) {if (responseBody != null) {BufferedSource source = responseBody.source();while (!source.exhausted()) {// 读取一行数据String line = source.readUtf8Line();if (line == null) {break;}// 跳过空行和注释if (line.trim().isEmpty() || line.startsWith(":")) continue;// 处理数据行if (line.startsWith("data: ")) {String data = line.substring(6).trim();// 检查是否为结束标记if ("[DONE]".equals(data)) {
// System.out.println("\n[流结束]");break;}// 打印接收到的数据JsonObject parse = JsonUtils.parse(data);JsonElement jsonElement = parse.get("choices");if (jsonElement != null) {JsonArray asJsonArray = jsonElement.getAsJsonArray();JsonElement jsonElement1 = asJsonArray.get(0);JsonObject asJsonObject = jsonElement1.getAsJsonObject();JsonElement jsonElement2 = asJsonObject.get("delta");if (jsonElement2 != null) {JsonObject asJsonObject1 = jsonElement2.getAsJsonObject();JsonElement jsonElement3 = asJsonObject1.get("content");if (jsonElement3 != null) {System.out.print(jsonElement3.getAsString());}}}}}}} catch (Exception e) {System.err.println("处理响应时出错: " + e.getMessage());}}});// 防止主线程退出try {int input = System.in.read();if (input != -1) {System.exit(1);}} catch (IOException e) {System.err.println("请求失败: " + e.getMessage());} finally {client.dispatcher().executorService().shutdown();}}
}
输出的结果
当然可以!下面是一个适用于 Java 8 环境的 快速排序(Quick Sort) 实现示例,适用于整型数组排序:
✅ 快速排序(Quick Sort)Java 8 示例:
public class QuickSort {// 主方法,用于调用排序public static void quickSort(int[] arr, int left, int right) {if (left < right) {int pivotIndex = partition(arr, left, right);quickSort(arr, left, pivotIndex - 1); // 排序左半部分quickSort(arr, pivotIndex + 1, right); // 排序右半部分}}// 分区函数,返回基准元素的最终位置private static int partition(int[] arr, int left, int right) {int pivot = arr[right]; // 选择最右边的元素作为基准int i = left - 1; // i 指向比 pivot 小的区域的最后一个元素for (int j = left; j < right; j++) {if (arr[j] <= pivot) {i++;swap(arr, i, j); // 把比 pivot 小或等于的元素交换到左边}}swap(arr, i + 1, right); // 把 pivot 放到正确的位置return i + 1;}// 交换数组中两个元素的位置private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}// 测试代码public static void main(String[] args) {int[] nums = { 5, 2, 9, 1, 5, 6 };System.out.println("排序前:" + java.util.Arrays.toString(nums));quickSort(nums, 0, nums.length - 1);System.out.println("排序后:" + java.util.Arrays.toString(nums));}
}
✅ 输出示例:
排序前:[5, 2, 9, 1, 5, 6]
排序后:[1, 2, 5, 5, 6, 9]
✅ 说明:
- 使用经典的 分治法(Divide and Conquer)策略。
- 时间复杂度:平均为
O(n log n)
,最坏为O(n²)
(当数组已经有序时)。 - 可以通过随机选择 pivot 来优化最坏情况。
如果你需要排序 Integer
类型的数组、泛型数组,或者使用 List<Integer>
,也可以告诉我,我可以帮你扩展实现。