【问题标题】:How to create a Grid without POJO (dynamic columns)?如何创建没有 POJO(动态列)的网格?
【发布时间】:2021-08-12 06:01:55
【问题描述】:

问题在这里提出:https://vaadin.com/forum/thread/18095407/how-to-create-a-grid-without-binder

但是 vaadin 的论坛关闭了,所以我想在这里继续。

在 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);
    }
}

【问题讨论】:

  • 请添加您尝试过的代码以及失败的原因(例如错误、堆栈跟踪、日志等),以便我们对其进行改进。
  • 链接的论坛讨论已经包含一个答案。检查我发布的 GitHub 链接。 Vaadin 14 也可以使用相同的方法。
  • “哪种方法在性能方面更好” - 除非您根据您的工作负载来衡量它,否则没人会知道。

标签: vaadin vaadin-flow vaadin-grid


【解决方案1】:

Vaadin 的 SerializablePredicate 接受函数引用和 Lambda,因此可以在 Vaadin 中使用non-POJO data types with Grid and Binder,尽管这有点不合常规。主要成分是:

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

如果您需要保护内部,您也可以将 Map 包装在自定义类中。

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<>();

至于性能,本质上,您是在比较使用按索引获取的 List 与使用键获取的 HashMap。这是一个相关的问题:ArrayList .get faster than HashMap .get?

如果你可以用数字索引列,你也可以使用ArrayList as Grid's type

这两种方法都允许生成具有不同动态列数的网格,例如,如果您直接从文件中读取数据或有原始数据后端查询。

【讨论】:

  • 感谢 Talu Lund 的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多