我收到一个对象数组的列表,
List<Object[]> rawRows = service.getRows();任何特定的值都可以得到。
(Date)((Object[])rawRows.get(i))[3] // In each item, Array Element #3 is a certain Date我需要将它映射到POJO的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。
发布于 2020-02-04 22:33:15
首先,将您的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[]中的任何东西的Object[]。这种逻辑应该封装在它自己的方法(或者理想情况下是类)中,它只处理序列化和/或反序列化。外部用户(如您的Stream)将本质的实体委托给该类或方法。最终,Stream只处理迭代数据和应用过滤器和转换的过程。它不知道这些过滤器和转换需要什么。
rawRows.stream().map(this::rawRowToReport).collect(Collectors.toList());https://stackoverflow.com/questions/60066120
复制相似问题