Как создать сетку без POJO (динамических столбцов)?

Вопрос задан здесь: https://vaadin.com/forum/thread/18095407/how-to-create-a-grid-without-binder

Однако форум ваадина закрылся, поэтому я хочу продолжить его здесь.

На Vaadin 14 любые рекомендации по лучшему способу реализации сетки с динамически изменяющимся количеством столбцов. Использование индекса столбца (1,2,3...) для меня не лучший выбор. Допустим, у меня есть простой файл Json (только 1 уровень: ключ-значение) для сопоставления с сеткой, и этот Json имеет неизвестный список свойств.

какой подход лучше с точки зрения производительности?:

[Вариант 1]

class Data {
    private Map<String, Object> values = new HashMap<>();
    
    public void set(String key, Object val) {
        values.put(key, val);
    }
    
    public Object get(String key) {
        return values.get(key);
    }
}

Grid<Data> myGrid = new Grid<>();

[Вариант 2]

public class GridDynamicValueProvider implements ValueProvider<GridDynamicRow, Object> {

    private int columnIndex;

    public GridDynamicValueProvider(int columnIndex) {
        this.columnIndex = columnIndex;
    }

    @Override
    public Object apply(GridDynamicRow dynamicRow) {
        return dynamicRow.getValue(columnIndex);
    }

}

public class GridDynamicRow {

    private List<Object> values = new ArrayList<>();

    public void addValue(String value) {
        values.add(value);
    }

    public Object getValue(int columnIndex) {
        return values.get(columnIndex);
    }
}


person Thang Le    schedule 23.05.2021    source источник
comment
Пожалуйста, добавьте код, который вы пробовали, и причину сбоя (например, ошибки, трассировки стека, журналы и т. д.), чтобы мы могли его улучшить.   -  person cfrick    schedule 23.05.2021
comment
Связанное обсуждение на форуме уже содержит ответ. Проверьте ссылку GitHub, опубликованную мной. Тот же метод можно использовать и с Vaadin 14.   -  person Tatu Lund    schedule 24.05.2021
comment
какой подход лучше с точки зрения производительности — никто не узнает, если вы не измерите его для вашей рабочей нагрузки.   -  person cfrick    schedule 24.05.2021


Ответы (1)


SerializablePredicate Vaadin принимает как ссылки на функции, так и Lambdas, поэтому можно использовать типы данных, отличные от POJO. с Grid и Binder в Vaadin, хотя это немного нетрадиционно. Ключевые ингредиенты:

Grid<Map<String, Integer>> grid = new Grid<>();
...
grid.addColumn(map -> map.get("column")).setHeader("Column");

Вы также можете обернуть карту в пользовательский класс, если вам нужно защитить внутренние компоненты.

class Data {
    private Map<String, Object> values = new HashMap<>();
    
    public void set(String key, Object val) {
        values.put(key, val);
    }
    
    public Object get(String key) {
        return values.get(key);
    }
}

Grid<Data> myGrid = new Grid<>();

Что касается производительности, по сути, вы сравниваете использование списка, где вы выбираете по индексу, и HashMap, где вы выбираете по ключу. Вот связанный с этим вопрос: ArrayList .get быстрее, чем HashMap .get?

Вы также можете использовать ArrayList в качестве типа сетки, если вы можете индексировать столбцы числом.

Оба подхода позволяют генерировать сетки с различным динамическим числом столбцов, например, если вы читаете данные непосредственно из файла или имеете запросы к необработанным данным.

person Tatu Lund    schedule 24.05.2021
comment
Спасибо за совет Талу Лунд. - person Thang Le; 25.05.2021