思考过程:
案例 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 能助力大家更上一层楼!