实际工作中解决空指针的Option记录
2017-09-18 00:00
197 查看
实际工作中解决空指针的Option记录
原因: 空指针真他妈操蛋,公司的数据库更操蛋,又空指针,还有这样的值'',你们想想我心里的一万匹草泥马.
需求: 需要向employee对象里设置一个从数据库里查询的值(查询出这个值所需的条件也是从数据库里查询出来的,不要吐槽数据库,不是俺设计的.里面就有
''这样的值!同时也又正常的空指针,就是不设置默认值,嘿嘿)
代码:
@RunWith(Parameterized.class) public class ServiceTest { private String time = "2017-07-13";//查询条件的部分 private int days = 10;//查询出来的天数,从子数据库 DepartmentCostExtensive employee = new DepartmentCostExtensive(); @Parameter public String stratTime; @Parameter(1) public String endTime; @Parameter(2) public String startDays; @Parameter(3) public String endDays; public static final String[][] datas = { {"2017-06-13", "2017-08-13", "10", "10"}, {"2017-07-10", "2017-08-13", "0", "10"}, {"2017-06-13", "2017-07-15", "10", "0"}, {"2017-07-10", "2017-07-15", "0", "0"} }; @Parameters(name = "{index}->{0} to {1} beforeDays:{2},afterDays:{3}") public static Iterable<String[]> assign() { return Arrays.asList(datas); } @Test public void test() { //虚拟构造level Level level = new Level(); level.setStartRenderTime(Date.valueOf(LocalDate.parse(stratTime))); level.setEndRenderTime(Date.valueOf(LocalDate.parse(endTime))); level.setInCoefficient("1.0"); level.setExceedCoefficient("1.0"); Optional<Date> startRenderTime = Optional.ofNullable(level.getStartRenderTime()); Optional<Date> endRenderTime = Optional.ofNullable(level.getEndRenderTime()); BiConsumer<Boolean, Integer> beforeConsumer = (Boolean flag, Integer value) -> { if (flag) employee.setBeforeRender(value); }; BiConsumer<Boolean, Integer> afterConsumer = (Boolean flag, Integer value) -> { if (flag) employee.setAfterRender(value); }; beforeConsumer.accept(startRenderTime.map(date -> isBefore(date)).orElse(false), days); afterConsumer.accept(endRenderTime.map(date -> isAfter(date)).orElse(false), days); assertThat(employee.getBeforeRender() + "", is(startDays)); assertThat(employee.getAfterRender() + "", is(endDays)); } private boolean isBefore(Date date) { return date.toLocalDate().isBefore(LocalDate.parse(time).with(TemporalAdjusters.firstDayOfMonth())); } private boolean isAfter(Date date) { return date.toLocalDate().isAfter(LocalDate.parse(time).with(TemporalAdjusters.lastDayOfMonth())); } }
分析: 上面代码已经很详细了,关键是思路,level里面的参数startRenderTime和endRenderTime是我下面要查询的days数据的查询条件,但是它需要被各种转换(这个我也很无奈,数据库不是我设计的),因此必须保证它正确才能正常的执行,不喜欢写xxx!=null这样的语句,这里我们用option来解决这个问题,用optition来包装level出来需要的对象,然后用consumer来执行不同的行为.如果田间判断为真,就执行(这
3ff0
里可以看出我们的查询条件是2017-07-13,startTime为2017-06-13的时候,比2017-07-01前面,故执行操作,插入天数10;同理endTime为2017-07-15的时候,比2017-07-31前面,因此不执行操作,采用默认值)
求解:
求能把这两个consumer和判断predicate能一次性合起来又简单的方法!
这种的单元测试能不能不让要被注入的参数全是一种类型的,这里parameter(2)和parameter(3)写不成
int
||
Integer类型的,谁能解决下请
@373035580.
用map方法来解决次问题:
//todo:先不更次部分,整体代码全部用函数式编程重构完一次再回来更新次部分,最好的方式当然是map方法了!//此次项目会整个加入分布式框架,监控,和用scala/Java分别写的大数据处理程序,分两种,一种是和web集成的(性能很低),另一种是单独的spark数据处理,从kafka读取并处理.然后借此机会把java9也跟新进去,刚出来的,哇咔咔,爽,写了java8以后不想用Java写代码了,目前脑子里全是函数式,各种想把一个项目用流式直接处理完的想法.
相关文章推荐
- 记录下工作过程中,需要解决的一些问题
- Android 工作问题解决记录
- 记录工作中第一次解决bug的小事
- 【记录】正则表达式学习第3天(正则学习笔记),又解决了个实际问题。
- 巧妙使用Map集合,解决实际工作中的问题
- [问题记录]解决警告"ld: warning: directory not found for option XXXX"
- 实际工作中ORA-01578: ORACLE data block corrupted遇到问题的解决方式
- 顺丰科技工作期间,遇到的问题和解决方法记录
- 记录最近工作使用javascript对select[option]的操作
- ORACLE11.2.0.4 版本升级ORA-39700: database must be opened with UPGRADE option问题解决记录
- 数据库查询速度极慢【个人工作问题解决过程记录】
- 【工作记录】SpringMVC下js提交大数据量到controller失败解决
- 记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑
- 我要做一个蠕动泵的工作记录(二)做一个arduino 多级菜单(1)麻烦的指针
- 工作记录:js数组元素排队思路完美解决将浏览记录到cookie的问题
- Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的各种问题,以及实现hadoo
- 平时工作中遇到的问题点解决记录
- 把工作中遇到的问题和解决方法记录下来!
- 【工作记录0014】C#"该行已经属于另一个表"解决方法
- [工作随笔]记录一个App项目所遇到的问题及解决