首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8LAMBDA:将List<Object[]> (对象数组列表)映射到List<Bean>

Java8LAMBDA:将List<Object[]> (对象数组列表)映射到List<Bean>
EN

Stack Overflow用户
提问于 2020-02-04 21:56:51
回答 1查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
List<Object[]> rawRows = service.getRows();

任何特定的值都可以得到。

代码语言:javascript
复制
(Date)((Object[])rawRows.get(i))[3]  // In each item, Array Element #3 is a certain Date

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

代码语言:javascript
复制
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>

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-04 22:33:15

首先,将您的lambda从

代码语言:javascript
复制
obj -> new Report((String)((Object[])rawRows.get(0))[0] ...

代码语言:javascript
复制
obj -> new Report((String) obj[0] ...

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

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

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

代码语言:javascript
复制
rawRows.stream().map(this::rawRowToReport).collect(Collectors.toList());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60066120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档