需求描述: 从FTP上下载csv文件.读取csv文件内容写入到数据库中.
要求: 判断csv文件是否有重复的记录
实现方案: 读取文件内容, 转换为List<Map<String, Object>>.判断List中的Map是否存在相同的对象.
代码实现:利用Java的stream API 数据分组
/**
* 自定义分组key的规则,是拼接某几个参数(这里拼接的是map中的所有元素)
* 这里和sql语句中group by 语句一样的思想.
*/
private String getGroupKey(Map<String, Object> map) {
String groupKey = "";
for (Map.Entry entry : map.entrySet()) {
groupKey += entry.getValue();
}
return groupKey;
}
/**
* 方法1: 判断分组结果, 如果大于1说明存在重复记录
*/
Map<String, List<Map<String, Object>>> repeatRecord = result.stream().collect(Collectors.groupingBy(this::getGroupKey));
for (List<Map<String, Object>> entry : repeatRecord.values()) {
if (entry.size() > 1) {
return true;
}
}
/**
* 方法2(推荐): 更简单, 一行代码实现, 直接调用Stream API
*/
Map<String, Long> collect = result.stream().collect(Collectors.groupingBy(this::getGroupKey, counting()));
for (Long n : collect.values()) {
if (n > 1) {
return true;
}
}
Stream 很强大呀, 需要不断深入学习.