需求背景:由于公司安装的apollo比较老,虽然新版本已经支持yaml格式了,但升级apollo代价比较大,有个项目配置文件之前放在项目里基于yaml编写的,最近想切换到apollo存储配置文件。
【人工智能】为啥我最近很少写python编程文章了,浅谈AI+编程+RPA提升工作效率
在这篇文章中, 我已经在IntelliJ IDEA2023.3.4 中安装好通义灵码,下面就以idea中的通义灵码为例。
最初我不假思索直接提问: 请用java语言生成yaml转换properties工具类, 最后的结果可想而知,没达到自己想要的效果。
问题1、properties生成格式不正确。期望yaml包含多层树形结构,要求生成的properties也要使用多层。
问题2、properties生成的顺序杂乱无章,期望按照yaml的顺序
问题3:yaml里包含注释,AI没考虑到注释情况
通过一步一步调教,最后得到可运行的代码。示例如下:
import org.yaml.snakeyaml.Yaml;import java.io.*;import java.nio.charset.StandardCharsets;import java.util.*;import org.yaml.snakeyaml.Yaml;
public class YamlToProps {
public static void main(String[] args) throws IOException {
String inputPath = "xxxx.yml"; String outputPath = "xxxx.properties";
convertYamlToProperties(inputPath, outputPath);
}
public static void convertYamlToProperties(String inputPath, String outputPath) throws IOException { // 读取 YAML 文件 Yaml yaml = new Yaml(); FileInputStream fis = new FileInputStream(inputPath); Reader reader = new InputStreamReader(fis, StandardCharsets.UTF_8); Map<String, Object> yamlContent = yaml.load(reader);
// 使用扩展的 Properties 类存储结构化数据 OrderedProperties props = new OrderedProperties();
// 遍历 YAML 内容并转换到 Properties 中 convertToProperties(yamlContent, "", props);
// 保存到 properties 文件 try (OutputStream output = new FileOutputStream(outputPath)) { props.store(output, null); } }
private static void convertToProperties(Map<String, Object> content, String prefix, OrderedProperties props) { for (Map.Entry<String, Object> entry : content.entrySet()) { String key = prefix.isEmpty() ? entry.getKey() : prefix + "." + entry.getKey(); Object value = entry.getValue();
if (value instanceof Map) { // 处理内嵌 Map 结构 convertToProperties((Map<String, Object>) value, key, props); } else if (value instanceof List) { // 如果值是列表,这里可以根据需求转换为逗号分隔的字符串或其他适合Properties的形式 // 示例:props.put(key, String.join(",", (List<String>) value)); } else { // 添加常规键值对 props.put(key, value.toString()); } } }
// 自定义扩展 Properties 类以保持顺序 static class OrderedProperties extends LinkedHashMap<String, String> {
public synchronized Enumeration<Object> keys() { return Collections.enumeration(new ArrayList<>(keySet())); }
public void store(OutputStream out, String comments) throws IOException { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)); if (comments != null && !comments.isEmpty()) { bw.write("# " + comments.replace("\n", "\n# ")); bw.newLine(); } for (Map.Entry<String, String> entry : this.entrySet()) { bw.write(entry.getKey() + "=" + entry.getValue()); bw.newLine(); } bw.flush(); } }}
代码生成好后,代码执行得到自己想要的工具类。
其实我们会发现, AI需要我们提供准确的话术才能一步步达到自己想要的结果,我们要对它提要求 和验收标准。 这就和产品经理给程序员提需求一样, 我们好比一个产品经理,AI工具相当于开发工程师, 如果产品经理提需求不具体,由于每个人的思维理解不一致(包括产品经理、开发工程师、测试工程师),可能做出来的东西和需求方不一样。需求细节沟通在项目整个过程中,真的很重要。
我最后想说,AI工具只是辅助, 我们的大脑思维才是 解决问题的关键。
领取专属 10元无门槛券
私享最新 技术干货