Java-学习日记(抽象类,Spring注释,ConcurrentHashMap)
9.17学习知识点:abstract,抽象类,@FunctionalInterface,ConCurrentHashMap
写这篇文章主要是今天没读懂下面的代码,然后就进行了剖析
@Autowired
@Qualifier("statisticJdbcTemplate")
private JdbcTemplate statisticJdbcTemplate;
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(statisticJdbcTemplate);
Map<String, Object> params = new HashMap<>();
params.put("beginDate", beginDate);
params.put("endDate", endDate);
ConcurrentHashMap<String, Long> statisticMap = new ConcurrentHashMap<>();
statisticMap.put("totalCount", 0L);
ArrayList<RentRecord> rentRecords = new ArrayList<>();
namedParameterJdbcTemplate.query(QueryRentRequest(), params, rs -> {
RentRecord rentRecord = CommonUtils.parseResult(rs, RentRecord.class);
buildRentDetails(rentRecord);
rentRecords.add(rentRecord);
if (rentRecords.size() == pageSize) {
saveRentRecord(statisticMap, rentRecords);
}
});
-
首先namedParameterJdbcTemplate是基于JdbcTemplate,对其封装了,内部有query(SQL, Map, 处理数据)函数返回多行数据,,
-
而rs->{}就是new Runnable(){}一个新线程,所以就需要后续的ConcurrentHashMap,HashMap.put方法在并发下可能会导致死循环,而ConcurrentHashMap基于并发分离锁,属于非阻塞,例如当线程A在pull的时候,线程B只能getA已经成功插入的数据.
abstract
(Java接口方法默认都是public abstract,有abstract的方法必须要是抽象类。虚函数一般与多态结合起来说,java类都是虚函数,而所谓多态,就是同一接口,不同操作,有3大必要条件
继承
重写
基类引用指向派生类对象(引用还是指向基类
Parent p = new Child();//父类指子类
@FunctionalInterface
函数式接口:这里就是Lambda里面的内容了,接口有且仅有一个抽象方法abstract,
@FunctionalInterface
public interface PageCountHelper {
Long pageCount(Query query);
}
PageCountHelper pageCountHelper = (Query query) -> dao.pageCountA(query);
我曾七次鄙视自己的灵魂:
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。