Java 8 Лямбда: Список карт (Список массивов объектов) в Список <Bean> - PullRequest
2 голосов
/ 05 февраля 2020

Я получаю список массивов объектов,

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

Можно получить любое конкретное значение, например,

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

Мне нужно сопоставить это с List<Report> для POJO у которого есть определенные c поля, определенные для каждого значения:

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, ...)
    {
    }
}

Я озадачен следующим: Как бы я указал index в этом выражении 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, чтобы получить из исходного списка.

1 Ответ

4 голосов
/ 05 февраля 2020

Во-первых, измените вашу лямбду с

obj -> new Report((String)((Object[])rawRows.get(0))[0] ...

на

obj -> new Report((String) obj[0] ...

obj - это параметр лямбда, и в функции map() будет принимать значение каждого item in rawRows.

Далее я бы порекомендовал преобразовать лямбду в отдельную именованную функцию. Он будет иметь подпись public Report rawRowToReport(Object[] rawRow) и будет содержать все ваши логи индексации c вместо записи в лямбда-теле.

Причина этого, как вы заметили, "есть нет i индекса для отслеживания ": это потому, что индексация, выполняемая i, находится в самой необработанной строке. Это действительно просто логи десериализации c для всего, что есть в Object[]. Этот тип логики c должен быть заключен в свой собственный метод (или в идеале класс), который имеет дело только с сериализацией и / или десериализацией. Внешние пользователи (такие как Stream) делегируют мелкие детали этому классу или методу. В конечном итоге, Stream обрабатывает только процесс итерации данных и применения фильтров и преобразований. Он не знает, что требуют эти фильтры и преобразования.

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