私は、Object配列のリストを受け取ります
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, ...)
{
}
}
私は次に困惑:どのように私のように指定したインデックスを私の新しいにマップするために、このラムダ式で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
、元のリストから取得します。
まず、あなたからラムダを変更します
obj -> new Report((String)((Object[])rawRows.get(0))[0] ...
に
obj -> new Report((String) obj[0] ...
obj
ラムダパラメータであり、中にmap()
関数内の各項目の値になりますrawRows
。
次に、私は本当に独立した、という名前の関数にラムダの変換をお勧めします。これは、署名を持っているでしょうpublic Report rawRowToReport(Object[] rawRow)
し、すべてのインデックスのロジックを開催する代わりに、ラムダ体でそれを書きます。
あなたは、気づいたとしてその理由は、ある「全くありませんi
、私が追跡するための指標は、」で行われているインデックスがあるため、これは次のとおりです。i
生の行自体にあります。それは本当にただのです、デシリアライゼーション・ロジックにあるもののためにObject[]
。ロジックのこの種の唯一のシリアル化および/またはデシリアライズを扱う独自の方法(または理想的クラス)にカプセル化する必要があります。(あなたのような外部のユーザーはStream
)そのクラスやメソッドに核心を委任します。最終的には、Stream
データだけを反復処理し、フィルタおよび変換を適用するプロセスを処理します。これは、これらのフィルタと変換が必要かわかりません。
rawRows.stream().map(this::rawRowToReport).collect(Collectors.toList());