1、阅读数据监控项目的代码,依次解决遇到的问题
1、学习了Consumer接口和Predicate接口
a) 这两个接口,Predicate中的test()就是返回一个boolean值,Consumer的accepet()是表示要对传入对象的内部属性有产生修改的操作。按我的理解是,方法其实可以我们自己写一个也是一样的,但这里用接口,是为了方便让后来的人阅读代码的时候,明确我们代码的意思。即:这个函数,在这里的实现,必须要有对内部属性产生修改才行。
b) 阴差阳错之下,认真地学了一遍lambda表达式。比较详细地了解了一遍,但不确定能记住多少。
2、为了看懂一个函数式编程的地方调的方法有啥用,去看了 jdk 文档,然后学到了好多新知识
a) Map.entrySet 返回的是 Set<Map.Entry<K, V>> ,懵了于是去详尽了解了一下
- Map里面是用键值对存储的,这个我知道。但今天才知道实际上里面是存的 Map.Entry,而一个Map.Entry就是一个我们所说的键值对。而Map具体怎么找到内部的Map.Entry则要看具体是什么map,比如 HashMap 是搞了个 hash 表,TreeMap 是搞了棵二叉树。
- 由于返回的是存着Map.Entry的Set,所以我们就可以直接通过迭代同时获取<K, V>两个数据。
- 大致复习了一下内部类
3、MeterRegistry.forEach()这个方法:他的意思是,把 MeterRegistry 中的一个 Map 类型的成员变量 meterMap 转换成 Collection ,然后迭代遍历,把 meterMap 里的东西根据实现的 consumer 来修改或不修改什么的。
4、学习了Stream,这是一个 jdk 8 里新增的容器而非一个传输流。
5、扫了一眼 Striped64 的概念 : 在java8中添加用来支持累加器的并发组件。
6、public V computeIfAbsent(K key, java.util.function.Function<? super K, ? extends V> mappingFunction) 其中 mappingFunction 描述的是根据 key 来算 value 的 算法流程
7、看了看LongAdder,看得挺草得,后面用到了再仔细看吧,换个东西学了,今天不学这块了。