繁体   English   中英

Java 8 Lambda:映射列表<Object[]> (对象数组列表)到列表<Bean>

[英]Java 8 Lambda: Map List<Object[]> (List of Object Arrays) to List<Bean>

我收到一个对象数组列表,

List<Object[]> rawRows = service.getRows();

可以获得任何特定的值,例如

(Date)((Object[])rawRows.get(i))[3]  // In each item, Array Element #3 is a certain Date

我需要将它映射到一个List<Report>的 POJO,它具有为每个值定义的特定字段:

public class Report {
    private String abbreviation;
    private String username;
    private Integer recallid;
    private Date recalldate;
    // ... + getters/setters   

    // Constructor
    public Report (String abbreviation, String username, Integer recallid, Date recalldate, ...)
    {
    }
}

我被以下问题难住了:如何在这个 Lamba 表达式中指定索引以映射到我的新List<Report>

List<Report> detailReports =  rawRows.stream().map(obj -> new Report(
            (String)((Object[])rawRows.get(0))[0], // I'm hard-coding (0) but need "i"
            (String)((Object[])rawRows.get(0))[1], // I'm hard-coding (0) but need "i"
            (Integer)((Object[])rawRows.get(0))[2],// I'm hard-coding (0) but need "i"
            (Date)((Object[])rawRows.get(0))[3],   // I'm hard-coding (0) but need "i"
            //...
                           )).collect(Collectors.toList());             

我的目标是让List<Report>将所有数组元素完全按照指定的序列映射到每个对象的 POJO。 但是没有i索引供我跟踪。 在此示例中,我将0硬编码为从原始列表中获取的rawRow

首先,将您的 lambda 从

obj -> new Report((String)((Object[])rawRows.get(0))[0] ...

obj -> new Report((String) obj[0] ...

obj是 lambda 参数,在map()函数中将采用rawRows中每个项目的值。

接下来,我真的建议将 lambda 转换为单独的命名函数。 这将具有签名public Report rawRowToReport(Object[] rawRow)并将保存所有索引逻辑,而不是将其写入 lambda 主体。

这样做的原因是,正如您所注意到的, “没有我要跟踪的i索引” :这是因为i所做的索引是在原始行本身中进行的。 它实际上只是Object[]任何内容的反序列化逻辑 这种逻辑应该封装在它自己的方法(或理想的类)中,它只处理序列化和/或反序列化。 外部用户(如您的Stream )将细节委托给该类或方法。 最终, Stream只处理迭代数据和应用过滤器和转换的过程。 它不知道这些过滤器和转换需要什么。

rawRows.stream().map(this::rawRowToReport).collect(Collectors.toList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM