代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
同步比较器工具
作者:
霖_柒
/ 发布于
2015/7/15
/
599
项目中,我们常常遇到需要同步数据的情况,这个时候我们需要将 旧数据 与 新数据 做对比。处理三种情况的数据:①存在于旧数据,不存在于新数据的信息,进行移除操作;②存在于旧数据,也存在于新数据的信息,进行更新操作;③不存在于旧数据,存在于新数据的信息,进行添加操作。
/** * 基本 同步比较器 * @author linling * */ public class BasicComparator { public interface ListCompareHandler<T> { public void handlerNewEntry(T t); public void handlerNoMoreEntry(T t); public void handlerSameEntry(T t); /** * if oneList contain otherList return boolean , Otherwise return false; * @param oneList * @param otherList * @return */ public boolean contain(List<T> oneList, T t) throws Exception; } public <T> void compareTo(List<T> oldList, List<T> newList, ListCompareHandler<T> handler) throws Exception{ for(Iterator<T> iter = oldList.iterator(); iter.hasNext();) { T t = iter.next(); if(!handler.contain(newList, t)) { handler.handlerNoMoreEntry(t); } } for(Iterator<T> iter = newList.iterator(); iter.hasNext();) { T t = iter.next(); if(handler.contain(oldList, t)) { handler.handlerSameEntry(t); }else { handler.handlerNewEntry(t); } } } public interface SetCompareHandler<T> { public void handlerNewEntry(T t); public void handlerNoMoreEntry(T t); public void handlerSameEntry(T t); /** * if oneSet contain otherSet return true, Otherwise return false; * @param oneSet * @param otherSet * @return */ public boolean contain(Set<T> oneSet, T t) throws Exception; } public <T> void compareTo(Set<T> oldSet, Set<T> newSet, SetCompareHandler<T> handler) throws Exception{ for(Iterator<T> iter = oldSet.iterator(); iter.hasNext();) { T t = iter.next(); if(!handler.contain(newSet, t)) { handler.handlerNoMoreEntry(t); } } for(Iterator<T> iter = newSet.iterator();iter.hasNext();) { T t = iter.next(); if(handler.contain(oldSet, t)) { handler.handlerSameEntry(t); }else { handler.handlerNewEntry(t); } } } public interface MapCompareHandler<K,V> { public void handlerNewEntry(Map.Entry<K, V> entry); public void handlerNoMoreEntry(Map.Entry<K, V> entry); public void handlerSameEntry(Map.Entry<K, V> entry); /** * if oneMap contain otherMap return true, Otherwise return false; * @param oneMap * @param otherMap * @return */ public boolean contain(Map<K,V> oneMap, Map.Entry<K, V> entry) throws Exception; } public <K,V> void compareTo(Map<K,V> newMap, Map<K,V> oldMap, MapCompareHandler<K,V> handler) throws Exception{ Set<Map.Entry<K, V>> oldEntrySet = oldMap.entrySet(); for(Iterator<Map.Entry<K, V>> iter = oldEntrySet.iterator(); iter.hasNext();) { Map.Entry<K, V> entry = iter.next(); if(!handler.contain(newMap, entry)) { handler.handlerNoMoreEntry(entry); } } Set<Map.Entry<K, V>> newEntrySet = newMap.entrySet(); for(Iterator<Map.Entry<K, V>> iter = newEntrySet.iterator(); iter.hasNext();) { Map.Entry<K, V> entry = iter.next(); if(handler.contain(oldMap, entry)) { handler.handlerSameEntry(entry); }else { handler.handlerNewEntry(entry); } } } } 下面是实现了上面 基本比较器的基本类,负责初始化List和Set比较器的handler操作。我在项目中只需要集成下面这个类就好。 package com.bayern; import java.util.List; import java.util.Set; /** * 基本 全同步比较器 基础类 * @author linling * * @param <VO> */ public abstract class ComparatorAdapter<VO> extends BasicComparator { @SuppressWarnings("rawtypes") protected BasicService basicService; public abstract void setBasicService(BasicService<VO> basicService); public class ListCompareHandlerAdapter implements ListCompareHandler<VO> { public void handlerNewEntry(VO vo) { basicService.save(vo); } public void handlerNoMoreEntry(VO vo) { basicService.delete(vo); } public void handlerSameEntry(VO vo) { basicService.update(vo); } /** * 该方法必须被子类覆盖重写 */ @Override public boolean contain(List<VO> oneList, VO t) throws Exception{ throw new Exception(); } } public class SetCompareHandlerAdapter implements SetCompareHandler<VO> { public void handlerNewEntry(VO vo) { basicService.save(vo); } public void handlerNoMoreEntry(VO vo) { basicService.delete(vo); } public void handlerSameEntry(VO vo) { basicService.update(vo); } /** * 该方法必须被子类覆盖重写 */ @Override public boolean contain(Set<VO> oneSet, VO t) throws Exception{ throw new Exception(); } } } 最后,来个实际的比较器: package com.bayern; import java.util.Iterator; import java.util.List; import java.util.UUID; import javax.annotation.Resource; import org.springframework.stereotype.Component; /** * 摄像头比较器 * @author linling * */ @Component(value="cameraComparator") public class CameraComparator extends ComparatorAdapter<VoCamera>{ public CameraComparator(){ } @Resource(name="cameraServiceImpl") @Override public void setBasicService(BasicService<VoCamera> basicService) { super.basicService = basicService; } public class CameraComparatorHandler extends ListCompareHandlerAdapter{ private long schoolId; public CameraComparatorHandler(long schoolId) { this.schoolId = schoolId; } @Override public boolean contain(List<VoCamera> oneList, VoCamera t) throws Exception{ boolean exists = false; for(Iterator<VoCamera> iter = oneList.iterator(); iter.hasNext();) { VoCamera vo = iter.next(); if(t.getCameraSignature().equals(vo.getCameraSignature()) && schoolId == vo.getSchoolId().longValue()) { if(!CommonUtils.stringIsBlank(vo.getCameraId()) && CommonUtils.stringIsBlank(t.getCameraId())) { t.setCameraId(vo.getCameraId()); } exists = true; break; } } return exists; } @Override public void handlerNewEntry(VoCamera vo) { vo.setCameraId(UUID.randomUUID().toString()); super.handlerNewEntry(vo); } } }
试试其它关键字
同步比较器工具
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
霖_柒
贡献的其它代码
(
1
)
.
同步比较器工具
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3