java函数式接口实现按批次接收数据并通过csvwriter写入文件
时间: 2023-06-26 21:07:31 浏览: 122
java对csv文件进行读写操作
可以使用Java 8中的函数式接口来实现按批次接收数据并通过CSVWriter写入文件。
首先,我们需要定义一个函数式接口来表示数据处理函数:
```java
@FunctionalInterface
public interface DataHandler<T> {
void handle(List<T> data, CSVWriter writer) throws IOException;
}
```
该接口接受一个数据列表和一个CSVWriter对象,并将数据写入CSV文件中。
然后,我们可以实现一个方法来按批次接收数据并调用数据处理函数:
```java
public static <T> void processDataInBatches(Iterable<T> data,
int batchSize, CSVWriter writer, DataHandler<T> handler) throws IOException {
List<T> batch = new ArrayList<>(batchSize);
for (T item : data) {
batch.add(item);
if (batch.size() == batchSize) {
handler.handle(batch, writer);
batch.clear();
}
}
if (!batch.isEmpty()) {
handler.handle(batch, writer);
}
}
```
该方法接受一个数据集合,以及批次大小、CSVWriter对象和数据处理函数。它会遍历数据集合,将数据添加到批次列表中,当批次列表大小达到指定大小时,将调用数据处理函数将批次数据写入CSV文件中。如果还有剩余的数据没有写入,最后再调用一次数据处理函数。
最后,我们可以定义一个数据处理函数来将数据写入CSV文件中:
```java
DataHandler<String[]> csvHandler = (data, writer) -> {
for (String[] row : data) {
writer.writeNext(row);
}
};
```
该函数接受一个字符串数组列表和一个CSVWriter对象,将每个字符串数组写入CSV文件中。
完整示例代码如下:
```java
import com.opencsv.CSVWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@FunctionalInterface
public interface DataHandler<T> {
void handle(List<T> data, CSVWriter writer) throws IOException;
}
public class CsvWriterExample {
public static void main(String[] args) throws IOException {
String[] header = {"id", "name", "age"};
List<String[]> data = Arrays.asList(
new String[]{"1", "Alice", "25"},
new String[]{"2", "Bob", "30"},
new String[]{"3", "Charlie", "35"},
new String[]{"4", "Dave", "40"}
);
int batchSize = 2;
String fileName = "data.csv";
try (CSVWriter writer = new CSVWriter(Files.newBufferedWriter(Paths.get(fileName)))) {
writer.writeNext(header);
DataHandler<String[]> csvHandler = (batch, w) -> {
for (String[] row : batch) {
w.writeNext(row);
}
};
processDataInBatches(data, batchSize, writer, csvHandler);
}
}
public static <T> void processDataInBatches(Iterable<T> data,
int batchSize, CSVWriter writer, DataHandler<T> handler) throws IOException {
List<T> batch = new ArrayList<>(batchSize);
for (T item : data) {
batch.add(item);
if (batch.size() == batchSize) {
handler.handle(batch, writer);
batch.clear();
}
}
if (!batch.isEmpty()) {
handler.handle(batch, writer);
}
}
}
```
该示例代码将数据按批次写入CSV文件中。在main方法中,我们定义了一个包含数据的字符串数组列表和一个批次大小。然后,我们创建一个CSVWriter对象,并定义一个数据处理函数将批次数据写入CSV文件中。最后,我们调用processDataInBatches方法将数据按批次写入CSV文件中。
阅读全文