【问题标题】:Java 8 Lambda: Map List<Object[]> (List of Object Arrays) to List<Bean>Java 8 Lambda:将 List<Object[]>(对象数组列表)映射到 List<Bean>
【发布时间】:2020-02-04 21:56:51
【问题描述】:

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

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

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

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

我需要将此映射到一个 POJO 的 List&lt;Report&gt;,该 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 表达式中指定 index 以映射到我的新 List&lt;Report&gt;

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&lt;Report&gt;,其中所有数组元素都按照指定的顺序映射到每个对象的 POJO。但是没有i 索引供我跟踪。在此示例中,我将 0 硬编码为 rawRow 以从原始列表中获取。

【问题讨论】:

  • 我认为你做错了,你应该在 lambda 表达式中使用 obj (String) obj[0]
  • 函数式编程的理念是让你的 lambda(function) 保持无状态。即,它不应该依赖外部变量 i 来确定值是什么。正如死侍所提到的,obj 足以让您达到预期的价值
  • 谢谢你说的应该是obj[i]。

标签: java lambda java-8


【解决方案1】:

首先,将您的 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[] 中的任何内容,它实际上只是deserialization logic。这种逻辑应该封装在它自己的方法(或理想的类)中,它只处理序列化和/或反序列化。外部用户(例如您的Stream)将细节委托给该类或方法。最终,Stream 只处理迭代数据和应用过滤器和转换的过程。它不知道那些过滤器和转换需要什么。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多