Java 8 Lambda-按顺序读取索引中的数据透视表

时间:2019-03-22 19:59:10

标签: java

我有一个数据表List<APIQueue>,它以6元组的形式依次存储为PARAM_KEY / VALUE。我需要创建一个List<APIBean>,将它们分成行bean。

enter image description here

public class APIQueue extends {

    private Integer id;
    private Integer transactionId;
    private String parameterKey;
    private String parameterValue;  
    // + Getters/setters...

}

目标豆

public class APIBean {

    public String applId;
    public String transactionType;
    public String phsOrgCode;
    public String roleTypeCode;
    public String personId;
    public String versionId;

    public APIBean(String applId, String transactionType, String phsOrgCode, String roleTypeCode, String personId,
            String versionId) {
        this.applId = applId;
        this.transactionType = transactionType;
        this.phsOrgCode = phsOrgCode;
        this.roleTypeCode = roleTypeCode;
        this.personId = personId;
        this.versionId = versionId;
    }
    // + Getters/Setters

我需要按行索引分开。保证APPLID为#1,TRANSACTIONTYPE#2等。

我想知道是否应该只对while做一个连续的unitCount += 5循环,也许这样会更容易填充bean列表。但是,如果Lambdas是更好的解决方案,我可以使用它。

顺序读取的预期结果List<APIBean>

9643874  |  U  |  CA  |  GS  |  7734701  | M
9645606  |  U  |  CA  |  GS  |  7734701  | M

这将如何实施?我只熟悉以下构造函数映射,不适用于此处。

    List<APIQueue> apiQueueData = getAPIQueueData();

    // Can't use that here
    List<APIBean> apiBeans = apiQueueData.stream().map(obj -> new APIBean(obj.getField1(), obj.getField2(), ...));

1 个答案:

答案 0 :(得分:2)

Java 8流主要用于独立处理元素,但是您正在使用来自6个连续元素的数据来创建一个输出元素。您需要执行以下操作将其分为子列表并进行处理:

List<APIBean> apiBeans = IntStream.range(0, apiQueueData.size() / 6)
        .mapToObj(i -> apiQueueData.subList(i * 6, (i + 1) * 6))
        .map(data -> {
            String applId = data.get(0).getParameterValue();
            String transactionType = data.get(1).getParameterValue();
            String phsOrgCode = data.get(2).getParameterValue();
            String roleTypeCode = data.get(3).getParameterValue();
            String personId = data.get(4).getParameterValue();
            String versionId = data.get(5).getParameterValue();
            return new APIBean(applId, transactionType, phsOrgCode, roleTypeCode, personId, versionId);
        })
        .collect(Collectors.toList());

对于这个问题,我建议改用迭代器:

List<APIBean> apiBeans = new ArrayList<>();
Iterator<APIQueue> i = apiQueueData.iterator();
while (i.hasNext()) {
    String applId = i.next().getParameterValue();
    String transactionType = i.next().getParameterValue();
    String phsOrgCode = i.next().getParameterValue();
    String roleTypeCode = i.next().getParameterValue();
    String personId = i.next().getParameterValue();
    String versionId = i.next().getParameterValue();
    apiBeans.add(new APIBean(applId, transactionType, phsOrgCode, roleTypeCode, personId, versionId));
}