【ChatGPT應用篇】助力Beauty代碼的初體驗 | 京東雲技術團隊

思考過程:

案例1:項目裏面有Excel文件的解析場景,試着與ChatGPT進行了交互,現將問題整理如下:

1.給我寫一個Java版本的excel導入解析代碼 (毫不客氣的分配任務)

2.需要支持100000000數據量 (業務需求變更)

3.優化代碼需要支持10000000數據量 (降低數量級,減輕難度)

4.請採用面向對象的思想給做一下封裝 (初級工程師 -> 中級工程師)

5.進一步面向接口編程,抽離業務 (中級晉升應該加一點泛型訴求,代碼更Beauty)

6.替換掉 poi 採用EasyExcel (替換原始的默認技術選型,替換三方包)

7.進一步優化,能支持EasyExcel、POI自由切換 (問題沒問好!本意是想讓他進一步抽象,能基於SPI支持擴展點)

8.採用控制反轉方式優化 (與問題5有重複)

9.提升解析性能,採用多線程並行解析優化 (中級工程->高級工程師)

10.提升程序效率,把解析性能在提升10倍 (架構師的成本意識,這個問題的回答有點意思)

11.採用Spring IOC 控制反轉方式進一步封裝 (與問題8有重複)

12.添加異常 logger 打印 (優化細節)

13.添加更多的中文代碼註釋 (增強易讀性,優化細節)

14.將中文註釋替換成英文註釋 (^_^ 開始走向國際化)

15.日誌錯誤信息支持 國際化 資源文件 (國際化的開始……)

16.把上面Excel解析的代碼在給來個單元測試吧

17.…

案例2:項目裏面一個ES深度分頁優化的場景,問題整理如下:

1.Elasticsearch 深度分頁問題

2.Elasticsearch 深度分頁Java代碼

3.以上代碼採用面向IOC優化

4.進一步面向對象優化

5.基於泛型進行抽象

6.將 scroll API 替換爲 searchafter

7.使用 spring data elasticsearch 優化並實現 search After

8.以上代碼請採用jmeter 生成一個壓測腳本

9.上面Spring Data Elasticsearch 實現 search after 的示例代碼請採用 groovy 語言生成測試用例

案例2的代碼就不貼出來了,大家感興趣可以自行輸入以上問題進行體驗!

個人體會:程序領域問問題要採用專業術語,專業術語越強越能精準給予反饋!)

說明: 對於ChatGPT輸出的代碼沒有做仔細的Review及調試,但是看代碼風格基本上是改改就能用於生產的,對於代碼規範、命名還是很認可的!

案例過程:

Happy Coding!Beauty Code!

以下是一個與ChatGPT 結對編程的一個Excel數據解析案例,大家可以根據我的思考過程進行體驗,以下放了一些截圖,ChatGPT的反應速度驚人,代碼版本一步步進行迭代優化,感觸較深的是真正的高質量低代碼平臺要應運而生了!

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.read.listener.ReadListener;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet as PoiSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExcelParser {
    private ParserType parserType;
    
    public ExcelParser(ParserType parserType) {
        this.parserType = parserType;
    }
    
    public List<Map<String, String>> parse(File file, int sheetIndex) throws IOException {
        if (parserType == ParserType.EASY_EXCEL) {
            return parseWithEasyExcel(file, sheetIndex);
        } else if (parserType == ParserType.POI) {
            return parseWithPoi(file, sheetIndex);
        } else {
            throw new IllegalArgumentException("Invalid parser type");
        }
    }
    
    private List<Map<String, String>> parseWithEasyExcel(File file, int sheetIndex) {
        List<Map<String, String>> data = new ArrayList<>();
        DataListener listener = new DataListener(data);
        ExcelReaderBuilder readerBuilder = EasyExcel.read(file, listener);
        Sheet sheet = new Sheet(sheetIndex + 1, 0);
        readerBuilder.sheet(sheet).doRead();
        return data;
    }
    
    private List<Map<String, String>> parseWithPoi(File file, int sheetIndex) throws IOException {
        List<Map<String, String>> data = new ArrayList<>();
        FileInputStream inputStream = new FileInputStream(file);
        HSSFWorkbook workbook = file.getName().endsWith(".xls") ? new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
        PoiSheet sheet = workbook.getSheetAt(sheetIndex);
        List<String> headers = new ArrayList<>();
        for (Cell cell : sheet.getRow(0)) {
            headers.add(cell.getStringCellValue());
        }
        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);
            Map<String, String> record = new HashMap<>();
            for (int j = 0; j < headers.size(); j++) {
                Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                String value = "";
                switch (cell.getCellType()) {
                    case STRING:
                        value = cell.getStringCellValue();
                        break;
                    case NUMERIC:
                        value = Double.toString(cell.getNumericCellValue());
                        break;
                    default:
                        value = cell.getStringCellValue();
                        break;
                }
                record.put(headers.get(j), value);
            }
            data.add(record);
        }
        workbook.close();
        inputStream.close();
        return data;
    }
    
    public static void main(String[] args) throws IOException {
        File file = new File("excel_file.xlsx");
        ExcelParser parser = new ExcelParser(ParserType.EASY_EXCEL);
        List<Map<String, String>> data = parser.parse(file, 0);
        System.out.println(data);
    }
}

enum ParserType {
    EASY_EXCEL,
    POI
}

class DataListener extends ReadListener<Data> {
    private List<Map<String, String>> data;
    private List<String> headers;
    
    public DataListener(List<Map<String, String>> data) {
        this.data = data;
        this.headers = new ArrayList<>();
    }
    
    @Override
    public void onException(Exception exception) {
        // 處理異常
    }

    @Override
    public void onReadError(Exception exception) {
        // 處理讀取錯誤
    }

    @Override
    public void onSheet(int sheetIndex, Sheet sheet) {
        // 處理工作表信息
    }

    @Override
    public void onReadEnd() {
        // 讀取結束
    }

    @Override
    public void onHeadRow(Row row) {
        for (Cell cell : row) {
            headers.add(cell.getStringCellValue());
        }
    }

    @Override
    public void onRecord(Data data) {
        Map<String, String> record = new HashMap<>();
        for (int i = 0; i < headers.size(); i++) {
            record.put(headers.get(i), data.getField(i));
        }
        this.data.add(record);
    }
}

class Data {
    @ExcelProperty(index = 0)
    private String name;
    
    @ExcelProperty(index = 1)
    private int age;

import com.alibaba.excel.annotation.ExcelProperty;
import java.util.List;
import java.util.Map;

public class ExcelParser {
    private SheetParser sheetParser;
    
    public ExcelParser(SheetParser sheetParser) {
        this.sheetParser = sheetParser;
    }
    
    public List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception {
        return sheetParser.parse(fileName, sheetIndex);
    }

    public static void main(String[] args) throws Exception {
        String fileName = "excel_file.xlsx";
        SheetParser sheetParser = new EasyExcelSheetParser();
        ExcelParser parser = new ExcelParser(sheetParser);
        List<Map<String, String>> data = parser.parse(fileName, 0);
        System.out.println(data);
    }
}

interface SheetParser {
    List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception;
}

class EasyExcelSheetParser implements SheetParser {
    @Override
    public List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception {
        List<Map<String, String>> data = new ArrayList<>();
        DataListener listener = new DataListener(data);
        ExcelReaderBuilder readerBuilder = EasyExcel.read(fileName, listener);
        Sheet sheet = new Sheet(sheetIndex + 1, 0);
        readerBuilder.sheet(sheet).doRead();
        return data;
    }
}

class PoiSheetParser implements SheetParser {
    @Override
    public List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception {
        List<Map<String, String>> data = new ArrayList<>();
        FileInputStream inputStream = new FileInputStream(fileName);
        HSSFWorkbook workbook = fileName.endsWith(".xls") ? new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
        PoiSheet sheet = workbook.getSheetAt(sheetIndex);
        List<String> headers = new ArrayList<>();
        for (Cell cell : sheet.getRow(0)) {
            headers.add(cell.getStringCellValue());
        }
        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);
            Map<String, String> record = new HashMap<>();
            for (int j = 0; j < headers.size(); j++) {
                Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                String value = "";
                switch (cell.getCellType()) {
                    case STRING:
                        value = cell.getStringCellValue();
                        break;
                    case NUMERIC:
                        value = Double.toString(cell.getNumericCellValue());
                        break;
                    default:
                        value = cell.getStringCellValue();
                        break;
                }
                record.put(headers.get(j), value);
            }
            data.add(record);
        }
        workbook.close();
        inputStream.close();
        return data;
    }
}

class DataListener extends ReadListener<Data> {
    private List<Map<String, String>> data;
    private List<String> headers;
    
    public DataListener(List<Map<String, String>> data) {
        this.data = data;
        this.headers = new ArrayList<>();
    }
    
    @Override
    public void onException(Exception exception) {
        // 處理異常
    }

    @Override
    public void onReadError(Exception exception) {
        // 處理讀取錯誤
    }

    @Override
    public void onSheet(int sheetIndex, Sheet sheet) {
        // 處理工作表信息
    }

    @Override
    public void onReadEnd() {
        // 讀取結束
    }

    @Override
    public void onHeadRow(Row row) {
        for (Cell cell : row) {
            headers.add(cell.getStringCellValue());
        }
    }

    @Override
    public void onRecord(Data data) {
        Map<String, String> record = new HashMap<>();
        for (int i = 0; i < headers.size(); i++) {
            record.put(headers.get(i), data.getField(i));
        }
        this.data.add(record);
    }
}

class Data {
    @ExcelProperty(index = 0)
    private String name;
    
    @ExcelProperty(index = 1)
    private int age;
    
    // Getters and setters
}

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.read.listener.ReadListener;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;

public class ExcelParser {
    private SheetParser sheetParser;

    public ExcelParser(SheetParser sheetParser) {
        this.sheetParser = sheetParser;
    }

    public List<Map<String, String>> parse(String fileName, int sheetIndex) throws ExecutionException, InterruptedException {
        return sheetParser.parse(fileName, sheetIndex);
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        String fileName = "excel_file.xlsx";
        ExecutorService executor = Executors.newFixedThreadPool(2);
        List<Future<List<Map<String, String>>>> futures = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            SheetParser sheetParser = new EasyExcelSheetParser();
            Future<List<Map<String, String>>> future = executor.submit(() -> sheetParser.parse(fileName, i));
            futures.add(future);
        }
        List<Map<String, String>> data = new ArrayList<>();
        for (Future<List<Map<String, String>>> future : futures) {
            data.addAll(future.get());
        }
        System.out.println(data);
        executor.shutdown();
    }
}

interface SheetParser {
    List<Map<String, String>> parse(String fileName, int sheetIndex);
}

class EasyExcelSheetParser implements SheetParser {
    @Override
    public List<Map<String, String>> parse(String fileName, int sheetIndex) {
        List<Map<String, String>> data = new ArrayList<>();
        DataListener listener = new DataListener(data);
        ExcelReaderBuilder readerBuilder = EasyExcel.read(fileName, listener);
        Sheet sheet = new Sheet(sheetIndex + 1, 0);
        readerBuilder.sheet(sheet).doRead();
        return data;
    }
}

class PoiSheetParser implements SheetParser {
    @Override
    public List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception {
        // 實現 POI 的解析,類似於前面的示例
    }
}

class DataListener extends ReadListener<Data> {
    private List<Map<String, String>> data;
    private List<String> headers;

    public DataListener(List<Map<String, String>> data) {
        this.data = data;
        this.headers = new ArrayList<>();
    }

    @Override
    public void onHeadRow(Row row) {
        for (Cell cell : row) {
            headers.add(cell.getStringCellValue());
        }
    }

    @Override
    public void onRecord(Data data) {
        Map<String, String> record = new HashMap<>();
        for (int i = 0; i < headers.size(); i++) {
            record.put(headers.get(i), data.getField(i));
        }
        this.data.add(record);
    }
}

class Data {
    @ExcelProperty(index = 0)
    private String name;

    @ExcelProperty(index = 1)
    private int age;

    // Getters and setters
}

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class ExcelParser {
    private SheetParser sheetParser;

    @Autowired
    public ExcelParser(SheetParser sheetParser) {
        this.sheetParser = sheetParser;
    }

    public List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception {
        return sheetParser.parse(fileName, sheetIndex);
    }
}

interface SheetParser {
    List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception;
}

@Component
class EasyExcelSheetParser implements SheetParser {
    @Override
    public List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception {
        List<Map<String, String>> data = new ArrayList<>();
        DataListener listener = new DataListener(data);
        ExcelReaderBuilder readerBuilder = EasyExcel.read(fileName, listener);
        Sheet sheet = new Sheet(sheetIndex + 1, 0);
        readerBuilder.sheet(sheet).doRead();
        return data;
    }
}

@Component
class PoiSheetParser implements SheetParser {
    @Override
    public List<Map<String, String>> parse(String fileName, int sheetIndex) throws Exception {
        // 實現 POI 的解析,類似於前面的示例
    }
}

class DataListener extends ReadListener<Data> {
    private List<Map<String, String>> data;
    private List<String> headers;

    public DataListener(List<Map<String, String>> data) {
        this.data = data;
        this.headers = new ArrayList<>();
    }

    @Override
    public void onHeadRow(Row row) {
        for (Cell cell : row) {
            headers.add(cell.getStringCellValue());
        }
    }

    @Override
    public void onRecord(Data data) {
        Map<String, String> record = new HashMap<>();
        for (int i = 0; i < headers.size(); i++) {
            record.put(headers.get(i), data.getField(i));
        }
        this.data.add(record);
    }
}

class Data {
    @ExcelProperty(index = 0)
    private String name;

    @ExcelProperty(index = 1)
    private int age;

    // Getters and setters
}

原理學習:

知其然,並未知其所以然!直到看到下面的解惑視頻……

視頻號搜索: 於建國博士講解ChatGPT的工作原理及顛覆性影響,通俗易懂 (願學有所得)

職責有邊界、思考無邊界、擔當無邊界!!!

利用好ChatGPT一切皆有可能,用好新時代的生產力工具希望ChatGPT能助力大家更上一層樓!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章