直接先上一段代码:

        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);

 

 


本文转载:CSDN博客