[英]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.