直接先上一段代码:
try{
lastApName= resp0287.getTrans().getTransRs().getB2e0287Rs().stream()
.filter((Resp_b2e0287.B2E0287_RS r) -> r.getTranstype().equals("003") )//筛选:背书
.reduce((nrs, current)-> nrs.getReqdat().compareTo(current.getReqdat())>0?nrs:current)//取最近一次背书人
.get().getApplyname();
arr_temp.add(lastApName);
}
catch (Exception ex){
logger.error("提取最后背书人失败,resp is:{}错误:{}",resp,ex.toString());
}
本来调用中行0287汇票接口得到的B2e0287Rs是一个集合,里面有多个节点名称为b2e0287_rs的节点
需求是从这些节点中,找到节点的transtype为003的,并且是reqdat为最大日期的。
很自然的想到的是过滤,遍历排序,取最大。
但是JAVA8里有了新的办法lambda表达式语法,还有Stream语法。
可以用上面的语句完全替代FOR循环,排序等等。
对了,还要记录spring boot Reader 部分的处理
一开始写了一段死循环了,看源码,Reader一定要读到null才去Process的,所以Reader 类,声明了几个变量
private String lastApName = "";
private Integer readed = 0;//记录读取次数
private List<String> arr_temp = new ArrayList();//读取数组,记录读取字符串
并在READER方法里进行如下判断,这样就会在读过数据以后返回NULL值,不陷入死循环。
@Override
public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if (readed < this.arr_temp.size()) {
return this.arr_temp.get(readed++);
}
return null; //系统会一直读到NULL才回停止,只让系统读一次
}
备注如果读取银行的返回结果很多是XML结构的。那Reader可以声明为:
public class BillReader extends StaxEventItemReader<Resp_b2e0102.B2E0102_RS> {
reader可以将返回的XML字符串resp可以传递到processer的对应集合类中:
InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(resp.getBytes("UTF-8")));
this.setResource(resource);