## 八、学习点 ### 8.1 HotelPriceQuery 的参数分类 - 酒店维度参数、wrapper 维度参数、价格维度参数、用户维度参数 ### 8.2 标识的回传 - L 页和 D 页本来 ### 8.3 dubbo 的 consumer 异步 ### 8.4 本地缓存 - `private volatile Map<String, Wrapper> wrappersCacheMap = Maps.newConcurrentMap();` 为什么 volatile ### 8.5 基础信息 ### 8.6 过滤的时候存在两个维度,wrapper 和 price ### 8.7 isBlank or isEmpty | 情况 | isNull | isEmpty | isBlank | |---------------|--------|---------|---------| | null | true | N/A | N/A | | 空字符串 ("") | false | true | true | | 空格空白字符 (" ") | false | false | true | | 非空字符串 ("abc") | false | false | false | ### 8.8 L 页和 D 页会员单通的参数来源不同 ### 8.9 Optional 优化 ### 8.10 Bigdecimal 的累加 在 lambda 表达式中对变量的操作都是基于原变量的副本,不会影响到原变量的值。假定没有要求 lambda 表达式外部变量为 final 修饰,那么开发者会误以为外部变量的值能够在 lambda 表达式中被改变,而这实际是不可能的,所以要求外部变量为 final 是在编译期以强制手段确保用户不会在 lambda 表达式中做修改原变量值的操作。 其实这就要说到 Jvm 内存模型和线程了,因为实例变量存在堆中,而局部变量是在栈上分配,lambda 表达 (匿名内部类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式 (匿名类) 中其实是局部变量的一个拷贝。 ### 8.11 roomprice info 什么时候转的 ### 8.12 请求参数转 json 时的细节 String sceneFlagStr和private `Set<String>` sceneFlagSet 结果不同 800 -7.29 - 109.73 - 108.73 4.21 772.4